題目描述
任意輸入兩個9階以下矩陣,要求判斷第二個是否是第一個的旋轉矩陣,如果是,輸出旋轉角度(0、90、180、270),如果不是,輸出-1。 要求先輸入矩陣階數,然后輸入兩個矩陣,每行兩個數之間可以用任意個空格分隔。行之間用回車分隔,兩個矩陣間用任意的回車分隔。
輸入描述:
輸入有多組數據。 每組數據第一行輸入n(1<=n<=9),從第二行開始輸入兩個n階矩陣。
輸出描述:
判斷第二個是否是第一個的旋轉矩陣,如果是,輸出旋轉角度(0、90、180、270),如果不是,輸出-1。 如果旋轉角度的結果有多個,則輸出最小的那個。
示例1
輸出
復制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是否相等。