九度OJ 1164:旋转矩阵 (矩阵运算)
- 题目描述:
-
任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。
要求先输入矩阵阶数,然后输入两个矩阵,每行两个数之间可以用任意个空格分隔。行之间用回车分隔,两个矩阵间用任意的回车分隔。
- 输入:
-
输入有多组数据。
每组数据第一行输入n(1<=n<=9),从第二行开始输入两个n阶矩阵。
- 输出:
-
判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。
如果旋转角度的结果有多个,则输出最小的那个。
- 样例输入:
-
3 1 2 3 4 5 6 7 8 9 7 4 1 8 5 2 9 6 3
- 样例输出:
-
90
思路:
递归旋转,判断矩阵是否相同。
代码:
#include <stdio.h> #define M 9 struct point { int i; int j; }; struct point rotate(int n, int i, int j, int degree) { struct point p; p.i = i; p.j = j; int tmp; for (int k=1; k<=degree/90; k++) { tmp = p.i; p.i = p.j; p.j = n-1 - tmp; } return p; } int main(void) { int n, i, j; int a[M][M], b[M][M]; struct point p; int degree; while (scanf("%d", &n) != EOF) { for(i=0; i<n; i++) { for(j=0; j<n; j++) scanf("%d", &a[i][j]); } for(i=0; i<n; i++) { for(j=0; j<n; j++) scanf("%d", &b[i][j]); } for (degree = 0; degree < 360; degree += 90) { for(i=0; i<n; i++) { for(j=0; j<n; j++) { p = rotate(n, i, j, degree); if (a[i][j] != b[p.i][p.j]) break; } if (j != n && a[i][j] != b[p.i][p.j]) break; } //printf("%d\n", degree); //printf("i=%d, j=%d\n", i, j); if (i == n) { printf("%d\n", degree); break; } } if (degree == 360) printf("%d\n", -1); } return 0; } /************************************************************** Problem: 1164 User: liangrx06 Language: C Result: Accepted Time:0 ms Memory:912 kb ****************************************************************/
编程算法爱好者。