旋转矩阵-牛客网#

题目描述

任意输入两个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
//看这个我都懵了,一开始以为很简单,就是看下标变化的规律,可是好比90°,(0,0)->(0,k-1)可是(k-1,0)->(0,0)感受行和列没有任何的这个规律可循,难道是看行的变化规律
而后行内再看列的变化规律?最讨厌着规律了就是找不到。
//代码来自于:https://blog.csdn.net/wangyulinyy/article/details/9746113
#include <cstdio> #include <cstdlib> #include <iostream> #include <string.h> #include <algorithm>
 
using namespace std; int a[10][10], b[10][10], c[10][10]; void clm(int a[10][10], int c[10][10], int n) { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) c[i][j] = a[n-1-j][i]; } } int main() { int n; while(scanf("%d", &n) != EOF) { for(int i=0; i<n; i++) for(int j=0; j<n; j++) scanf("%d", &a[i][j]); for(int i=0; i<n; i++) for(int j=0; j<n; j++) scanf("%d", &b[i][j]); bool flag; for(int i=0; i<=3; i++) { if(i == 0) { flag = true; for(int i=0; i<n && flag; i++) for(int j=0; j<n && flag; j++) if(a[i][j] != b[i][j]) { flag = false; break;} if(flag) { printf("0\n"); break; } } else if(i == 1) { clm(a,c,n); flag = true; for(int i=0; i<n && flag; i++) for(int j=0; j<n && flag; j++) if(c[i][j] != b[i][j]) { flag = false; break;} if(flag) { printf("90\n"); break; } } else if(i == 2) { clm(c,a,n); flag = true; for(int i=0; i<n && flag; i++) for(int j=0; j<n && flag; j++) if(a[i][j] != b[i][j]) { flag = false; break;} if(flag) { printf("180\n"); break; } } else if(i == 3) { clm(a,c,n); flag = true; for(int i=0; i<n && flag; i++) for(int j=0; j<n && flag; j++) if(c[i][j] != b[i][j]) { flag = false; break;} if(flag) { printf("270\n"); break; } } } if(!flag) printf("-1\n"); } system("pause"); return 0; }

//这个函数就是顺时针旋转90度的,厉害,这样若是一次旋转不行的话,那么就两次180,三次270度。使用a和c进行替换,判断与b是否相等。ios

相关文章
相关标签/搜索