n階矩陣旋轉矩陣的順時針旋轉基本有四種情況:
- 0度
- 90度
- 180度
- 270度,相當於逆向的90度
演算法思路矩陣的計算主要是考慮下標之間的變換,先上一張我在紙上分析的圖(ps:好大啊,沒有壓縮)以aij為例,i,j均從1開始計數90度旋轉:
- 列號變為行號
- (n - 行號 + 1)變成列號
- 規律: a[i][j] = b[j][n - i + 1]
180度旋轉:
- (n - 行號 + 1)變為行號
- (n - 列號 + 1)變為列號
- 規律:a[i][j] = b[n - i + 1][n - j + 1]
270度旋轉(相當於逆時針旋轉90度):
- 行號變為列號
- (n - 列號 + 1)變為行號
- 規律:a[i][j] = b[n - j + 1][i]
acm題目
題目描述:
-
任意輸入兩個9階以下矩陣,要求判斷第二個是否是第一個的旋轉矩陣,如果是,輸出旋轉角度(0、90、180、270),如果不是,輸出-1。
要求先輸入矩陣階數,然後輸入兩個矩陣,每行兩個數之間可以用任意個空格分隔。行之間用斷行符號分隔,兩個矩陣間用任意的斷行符號分隔。
輸入:
-
輸入有多組資料。
每組資料第一行輸入n(1<=n<=9),從第二行開始輸入兩個n階矩陣。
輸出:
-
判斷第二個是否是第一個的旋轉矩陣,如果是,輸出旋轉角度(0、90、180、270),如果不是,輸出-1。
如果旋轉角度的結果有多個,則輸出最小的那個。
範例輸入:
-
31 2 34 5 67 8 97 4 18 5 29 6 3
範例輸出:
-
90
AC代碼(c語言實現)
#include <stdio.h>#include <stdlib.h>#define len 10int switchMatrix(int (*a)[len], int (*b)[len], int n);int main(){int i, j, n, angle;int a[len][len], b[len][len];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);}}//矩陣比較angle = switchMatrix(a, b, n);printf("%d\n", angle);}return 0;}int switchMatrix(int (*a)[len], int (*b)[len], int n){int angle, i, j;for(angle = 0, i = 0; i < n; i ++){for(j = 0; j < n; j ++){if(angle == 0){if(a[i][j] == b[i][j]){continue;}else{angle = 90;}}if(angle == 90){if(a[i][j] == b[j][n - i - 1]){continue;}else{angle = 180;}}if(angle == 180){if(a[i][j] == b[n - i - 1][n - j -1]){continue;}else{angle = 270;}}if(angle == 270){if(a[i][j] == b[n - j - 1][i]){continue;}else{angle = -1;}}if(angle == -1){break;}}if(angle == -1){break;}}return angle;}