本文主要是介绍九度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
- 来源:
- 2008年北京航空航天大学计算机研究生机试真题
思路:
递归旋转,判断矩阵是否相同。
代码:
#include <stdio.h>#define M 9struct 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: 1164User: liangrx06Language: CResult: AcceptedTime:0 msMemory:912 kb
****************************************************************/
这篇关于九度OJ 1164:旋转矩阵 (矩阵运算)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!