首页 > 试题广场 >

旋转矩阵

[编程题]旋转矩阵
  • 热度指数:5626 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。 要求先输入矩阵阶数,然后输入两个矩阵,每行两个数之间可以用任意个空格分隔。行之间用回车分隔,两个矩阵间用任意的回车分隔。

输入描述:
输入有多组数据。
每组数据第一行输入n(1<=n<=9),从第二行开始输入两个n阶矩阵。


输出描述:
判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。
如果旋转角度的结果有多个,则输出最小的那个。
示例1

输入

3
1 2 3
4 5 6
7 8 9
7 4 1
8 5 2
9 6 3

输出

90
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()) {
			int n = scanner.nextInt();
			int[][] arr = new int[n][n];
			for (int i = 0; i < arr.length; i++) {
				for (int j = 0; j < arr[i].length; j++) {
					arr[i][j] = scanner.nextInt();
				}
			}
			
			//旋转90度
			int[][] arr90 = new int[n][n];
			for (int i = 0; i < arr90.length; i++) {
				for (int j = 0; j < arr90[i].length; j++) {
					arr90[i][j] = arr[n-j-1][i];
				}
			}
			
			int[][] arr180 = new int[n][n];
			for (int i = 0; i < arr180.length; i++) {
				for (int j = 0; j < arr180[i].length; j++) {
					arr180[i][j] = arr90[n-j-1][i];
				}
			}
			
			int[][] arr270 = new int[n][n];
			for (int i = 0; i < arr270.length; i++) {
				for (int j = 0; j < arr270[i].length; j++) {
					arr270[i][j] = arr180[n-j-1][i];
				}
			}
			
			int[][] arrLast = new int[n][n];
			for (int i = 0; i < arrLast.length; i++) {
				for (int j = 0; j < arrLast[i].length; j++) {
					arrLast[i][j] = scanner.nextInt();
				}
			}
			
			if (isEqual(arrLast, arr)) {
				System.out.println(0);
			}else if (isEqual(arrLast, arr90)) {
				System.out.println(90);
			}else if (isEqual(arrLast, arr180)) {
				System.out.println(180);
			}else if (isEqual(arrLast, arr270)) {
				System.out.println(270);
			}else {
				System.out.println(-1);
			}
			
			
		}
	}
	public static boolean isEqual(int[][] arr,int[][] arr2) {
		
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr[i].length; j++) {
				if (arr[i][j] != arr2[i][j]) {
					return false;
				}
			}
		}
		return true;
	}
}

编辑于 2024-03-25 20:06:23 回复(0)
package beihang;

import java.util.Scanner;

/*航计算机历年复试上机题
矩阵旋转
链接:https://www.nowcoder.com/practice/bd62095a03a545729cdbfc506e0da952?
tpId=66&tqId=29632&rp=0&ru=/kaoyan/retest/1004&qru=/ta/buaa-kaoyan/question-ranking*/
public class Three {     public static void main(String[] args) {         Scanner sc = new Scanner(System.in);         int n = sc.nextInt();         int a[][] = new int[n][n];         int b[][] = new int[n][n];         for (int i=0;i<n;++i){             for (int j=0;j<n;++j)                 a[i][j] = sc.nextInt();         }         for (int i=0;i<n;++i){             for (int j=0;j<n;++j)                 b[i][j] = sc.nextInt();         }                  int ans = -1;         if (ans == -1 && turn(a,b,0))             ans = 0;         if (ans == -1 && turn(a,b,90))             ans = 90;         if (ans == -1 && turn(a,b,180))             ans = 180;         if (ans == -1 && turn(a,b,270))             ans = 270;         System.out.println(ans);                  sc.close();     }     //c是旋转的角度,该方法是判断b是否是a旋转c角度得到的,是返回true,否返回false     private static boolean turn(int[][] a, int[][] b,int c) {         int n = a.length;         for (int i=0;i<n;++i){             for (int j=0;j<n;++j){                 int row=0,col=0;                 switch(c){                     case 0:                         row = i;                         col = j;                         break;                     case 90:                         row = j;                         col = n-i-1;                         break;                     case 180:                         row = n-i-1;                         col = n-j-1;                         break;                     case 270:                         row = n-j-1;                         col = i;                         break;                 }                 if (a[i][j] != b[row][col])                     return false;             }         }         return true;     }
}

编辑于 2019-01-19 11:39:26 回复(0)