首页 > ACM题库 > 九度OJ > 九度-1171-C翻转[解题代码]
2013
12-13

九度-1171-C翻转[解题代码]

题目来源:2010年北京邮电大学计算机研究生机试真题

题目描述:

首先输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作数据为以x y为左上角的那几个数据。

操作类型有四种: 
1 2 表示:90度,顺时针,翻转4个数 
1 3 表示:90度,顺时针,翻转9个数 
2 2 表示:90度,逆时针,翻转4个数 
2 3 表示:90度,逆时针,翻转9个数 

输入:

输入有多组数据。
每组输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作数据为以x y为左上角的那几个数据。

输出:

输出翻转后的数组。

样例输入:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
1 3 1 1
样例输出:
11 6 1 4 5
12 7 2 9 10
13 8 3 14 15
16 17 18 19 20
21 22 23 24 25

java 代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) throws IOException {
		ArrayList<int[][]> list = new ArrayList<int[][]>();
		Scanner s = new Scanner(System.in);
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		while(s.hasNextInt()){
			
			int arrs[][] = new int[5][5];
			for(int i=0; i<5; i++){
				for(int j=0; j<5; j++){
					arrs[i][j] = s.nextInt();
				}
			}
			
			int a = s.nextInt();
			int b = s.nextInt();
			
			int x = s.nextInt();
			int y = s.nextInt();
			
//			int k1[] = {0,};
			
			if(a==1){
				if(b==2){
					 int t = arrs[x-1][y-1];
					 arrs[x-1][y-1] = arrs[x][y-1];
					 arrs[x][y-1] = arrs[x][y];
					 arrs[x][y] = arrs[x-1][y];
					 arrs[x-1][y] = t;
				}else{
					int t = arrs[x-1][y-1];
					arrs[x-1][y-1] = arrs[x+1][y-1];
					arrs[x+1][y-1] = arrs[x+1][y+1];
					arrs[x+1][y+1] = arrs[x-1][y+1];
					arrs[x-1][y+1] = t;
					
					t = arrs[x-1][y];
					arrs[x-1][y] = arrs[x][y-1];
					 arrs[x][y-1] = arrs[x+1][y];
					 arrs[x+1][y] = arrs[x][y+1];
					 arrs[x][y+1] = t;
				}
					
			}else{
				if(b==2){
					int t = arrs[x-1][y];
					arrs[x-1][y] = arrs[x][y];
					arrs[x][y] = arrs[x][y-1];
					arrs[x][y-1] = arrs[x-1][y-1];
					arrs[x-1][y-1] = t;
				}else{
					int t = arrs[x-1][y+1];
					arrs[x-1][y+1] = arrs[x+1][y+1];
					arrs[x+1][y+1] = arrs[x+1][y-1];
					arrs[x+1][y-1] = arrs[x-1][y-1];
					arrs[x-1][y-1] = t;
					
					t = arrs[x][y+1];
					arrs[x][y+1] = arrs[x+1][y];
					arrs[x+1][y] = arrs[x][y-1];
					arrs[x][y-1] = arrs[x-1][y];
					arrs[x-1][y] = t;
				}
			}
			
			for(int i=0; i<5; i++){
				for(int j=0; j<5; j++){
					if(j!=4)
						System.out.print(arrs[i][j]+" ");
                                             else 
						System.out.print(arrs[i][j]);
				}
			
					System.out.println();
			}
			
		
			
			
		}
		
		
		
	}

}
/**************************************************************
	Problem: 1171
	User: coder
	Language: Java
	Result: Accepted
	Time:180 ms
	Memory:17464 kb
****************************************************************/


  1. 学算法中的数据结构学到一定程度会乐此不疲的,比如其中的2-3树,类似的红黑树,我甚至可以自己写个逻辑文件系统结构来。

  2. 约瑟夫也用说这么长……很成熟的一个问题了,分治的方法解起来o(n)就可以了,有兴趣可以看看具体数学的第一章,关于约瑟夫问题推导出了一系列的结论,很漂亮