旋轉矩陣-牛客網#


題目描述

任意輸入兩個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是否相等。

 
            


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM