首页 > 代码库 > 90度翻转矩阵

90度翻转矩阵

	/**
	 * 一张图像表示成NxN的矩阵,图像中每个像素是4个字节,写一个函数把图像旋转90度。 
	 * 要求进行原地操作!(即不开辟额外的存储空间)
	 * 
	 * 可以分两步走。 第一步交换主对角线两侧的对称元素,第二步交换第i行和第n-1-i行,即得到结果
	 * 	原图:          		 第一步操作后:   第二步操作后:
	 *	1 2 3 4         1 5 9 13        4 8 12 16
	 *	5 6 7 8         2 6 10 14       3 7 11 15
	 *	9 10 11 12      3 7 11 15       2 6 10 14
	 *	13 14 15 16     4 8 12 16       1 5 9 13
	 */
	
	/**
	 * 生成一个矩阵
	 */
	public void q5_1(){
		//这里是逆时针旋转,顺时针换个对角线啊
		int[][] arr = new int[4][4];
		int num = 0;
		for(int i=0;i<4;i++){
			for(int j=0;j<4;j++){
				arr[i][j] = ++num;
				System.out.print(arr[i][j]+"\t");
			}
			System.out.println('\n');
		}
		
		System.out.println("====================第一步===");
		for(int i=0;i<4;i++){
			for(int j=0;j<i;j++){
				System.out.println("before ==> arr["+i+"]["+j+"] = "+arr[i][j]+"\t arr["+j+"]["+i+"] = "+arr[j][i]);
				int temp = arr[i][j];
				arr[i][j] = arr[j][i];
				arr[j][i] = temp;
				System.out.println("after  ==> arr["+i+"]["+j+"] = "+arr[i][j]+"\t arr["+j+"]["+i+"] = "+arr[j][i]);
			}
		}
		for(int i=0;i<4;i++){
			for(int j=0;j<4;j++){
				System.out.print(arr[i][j]+"\t");
			}
			System.out.println('\n');
		}
		
		System.out.println("====================第二步===");
		for(int i=0;i<2;i++){
			for(int j=0;j<4;j++){
				int temp = arr[i][j];
				arr[i][j] = arr[3-i][j];
				arr[3-i][j] = temp;
			}
		}
		
		for(int i=0;i<4;i++){
			for(int j=0;j<4;j++){
				System.out.print(arr[i][j]+"\t");
			}
			System.out.println('\n');
		}
	}


打印结果为:

1	2	3	4	

5	6	7	8	

9	10	11	12	

13	14	15	16	

====================第一步===
before ==> arr[1][0] = 5	 arr[0][1] = 2
after  ==> arr[1][0] = 2	 arr[0][1] = 5
before ==> arr[2][0] = 9	 arr[0][2] = 3
after  ==> arr[2][0] = 3	 arr[0][2] = 9
before ==> arr[2][1] = 10	 arr[1][2] = 7
after  ==> arr[2][1] = 7	 arr[1][2] = 10
before ==> arr[3][0] = 13	 arr[0][3] = 4
after  ==> arr[3][0] = 4	 arr[0][3] = 13
before ==> arr[3][1] = 14	 arr[1][3] = 8
after  ==> arr[3][1] = 8	 arr[1][3] = 14
before ==> arr[3][2] = 15	 arr[2][3] = 12
after  ==> arr[3][2] = 12	 arr[2][3] = 15
1	5	9	13	

2	6	10	14	

3	7	11	15	

4	8	12	16	

====================第二步===
4	8	12	16	

3	7	11	15	

2	6	10	14	

1	5	9	13	


========================================================================

	/**
	 * 写一个函数处理一个MxN的矩阵,如果矩阵中某个元素为0,那么把它所在的行和列都置为0.
	 */
	public void q5_2(){
		long startTime = System.currentTimeMillis();
		final int rowLen = 40;
		final int colLen = 55;
		int[][] arr= new int[rowLen][colLen];
		Random random = new Random();
		for(int i=0;i<rowLen;i++){
			for(int j=0;j<colLen;j++){
				arr[i][j] = random.nextInt(10);
				System.out.print(arr[i][j]+"\t");
			}
			System.out.println('\n');
		}
	
		boolean[] rows = new boolean[rowLen];
		boolean[] cols = new boolean[colLen];
		
		for(int i=0;i<rowLen;i++){
			for(int j=0;j<colLen;j++){
				if(arr[i][j]==0){
					//这里可以不用标识,直接写for循环
					rows[i] = true;
					cols[j] = true;
//					for(int r=0;r<rowLen;r++){
//						arr[r][j] = 0;
//					}
//					for(int c=0;c<colLen;c++){
//						arr[i][c] = 0;
//					}
				}
			}
		}
		
		for(int i=0;i<rowLen;i++){
			for(int j=0;j<colLen;j++){
				if(rows[i] || cols[j]){
					arr[i][j] = 0;
				}
			}
		}
		
		System.out.println("=========结果====");
		for(int i=0;i<rowLen;i++){
			for(int j=0;j<colLen;j++){
				System.out.print(arr[i][j]+"\t");
			}
			System.out.println('\n');
		}
		
		System.out.println("运行时间 : "+(System.currentTimeMillis()-startTime));
	}