旋轉矩陣-牛客網#

題目描述

任意輸入兩個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

相關文章
相關標籤/搜索