1. 程式人生 > >矩陣順時針旋轉90°、180°、270°

矩陣順時針旋轉90°、180°、270°

問題及程式碼:

/*
* Copyright (c) 2014, 煙臺大學計算機學院
* All rights reserved.
* 檔名稱:sdoj.cpp
* 作    者:李楠
* 完成日期:2015年2月7日
* 版 本 號:v1.0
*
* 問題描述:矩陣A在順時針旋轉一定角度後是否和矩陣B完全一樣
* 輸入描述:有多組輸入。 
            每組輸入先輸入一個整數N(N <= 50),代表矩陣的大小。
            接下來的N行,每行有N個整數。代表矩陣A。
            再接下來的N行N個整數代表矩陣B。
* 程式輸出:如果矩陣A在旋轉一定角度後能和矩陣B完全一樣則輸出YES,否則輸出NO。
*/
#include <iostream>
using namespace std;
int main()
{
    int first[51][51];
    int second[51][51];
    int third[51][51];
    int four[51][51];
    int five[51][51];
    int i,j,k;
    int n,l=1;
    while(cin>>n&&n<=50&&n>1)
    {
      k=n-1;
      for(i=0;i<n;i++)
        for(j=0;j<n;j++)
           cin>>first[i][j];
      for(i=0;i<n;i++)
        for(j=0;j<n;j++)
           cin>>third[i][j];
      for(i=0;i<n;i++,k--)
		for(j=0;j<n;j++)
			second[j][k]=first[i][j];
      k=n-1;
      for(i=0;i<n;i++,k--)
		for(j=0;j<n;j++)
			four[i][j]=first[j][k];
	  for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			five[i][j]=first[n-1-i][n-1-j];
      for(i=0;i<n;i++)
        for(j=0;j<n;j++)
           {
               if(second[i][j]!=third[i][j]&&four[i][j]!=third[i][j]&&five[i][j]!=third[i][j])
               {
                   l=0;
                   break;
               }
           }
      if(l!=0)
            cout<<"YES"<<endl;
      else
            cout<<"NO"<<endl;
    }
    return 0;
}

執行結果:

知識點總結:

1.從行的角度看:

原矩陣的第一行,變成了目標矩陣的最後一列。

原矩陣的第二行,變成了目標矩陣的倒數第二列。

原矩陣的第三行,變成了目標矩陣的倒數第三列。

原矩陣的第四行,變成了目標矩陣的倒數第四列。

.......

2.從列的角度看:

原矩陣的第一列,變成了目標矩陣的第一行,數字的方向相反。

原矩陣的第二列,變成了目標矩陣的第二行,數字的方向相反。

原矩陣的第三列,變成了目標矩陣的第三行,數字的方向相反。

原矩陣的第四列,變成了目標矩陣的第四行,數字的方向相反。

...

由此可知,矩陣順時針旋轉90的結果,就是把行變成列,把列變成行。

同理,逆時針旋轉90°也是這樣…

順時針旋轉180°:

如:1  2  3

       4  5  6

       7  8  9

旋轉後為:

      9  8  7

      6  5  4

      3  2  1

可知:旋轉後的順序是原來的逆序,那麼就好寫了~~

學習心得:

好吧…矩陣旋轉角度的我剛剛弄懂…