矩阵旋转

1.矩阵的旋转:
        矩阵的逆时针旋转基本有四种情况:
  • 0度
  • 90度
  • 180度
  • 270度,相当于顺向的90度

90度旋转:

  • 列号变为行号
  • (n - 行号 - 1)变成列号
  • 规律: a[i][j] = b[j][n - i - 1]

180度旋转:

  • (n - 行号 -1)变为行号
  • (m- 列号 + 1)变为列号
  • 规律:a[i][j] = b[n - i - 1][m - j - 1]

270度旋转(相当于逆时针旋转90度):

  • 行号变为列号
  • (m - 列号 + 1)变为行号
  • 规律:a[i][j] = b[m - j -1][i]
     注意:其中n,m分别为原来矩阵的行数和列数。


ACM例题:[2744]

题目描述

X终于开始玩一些比较高大上的东西了,比如矩阵。给出两个N*N的矩阵A,B。他想知道矩阵A在顺时针旋转一定角度后是否会和矩阵B完全一样。

输入

 有多组输入。
每组输入先输入一个整数N(N <= 50),代表矩阵的大小。
接下来的N行,每行有N个整数。代表矩阵A。
再接下来的N行N个整数代表矩阵B。

输出

如果矩阵A在旋转一定角度后能和矩阵B完全一样则输出YES,否则输出NO。

示例输入

2
1 2
3 4
3 1
4 2
2
1 2
3 4
4 2
3 1

示例输出

YES
NO

代码:

[objc]  view plain  copy
  1. #include<stdio.h>    
  2. #include<math.h>    
  3.   
  4. int main()    
  5. {    
  6.     int i,j;    
  7.     int a[50][50],b[50][50];    
  8.     int c;    
  9.     int d=1;    
  10.     
  11.     while(scanf("%d",&c)!=EOF)    
  12.     {    
  13.     
  14.         for(i=0;i<c;i++)    
  15.             for(j=0;j<c;j++)    
  16.             {    
  17.                 scanf("%d",&a[i][j]);    
  18.             }    
  19.     
  20.         for(i=0;i<c;i++)    
  21.             for(j=0;j<c;j++)    
  22.             {    
  23.                 scanf("%d",&b[i][j]);    
  24.             }      
  25.     
  26.         for(i=0;i<c;i++)    
  27.             for(j=0;j<c;j++)    
  28.             {    
  29.                 if(a[i][j]!=b[i][j]){break;}    
  30.             }    
  31.     
  32.         if(i==c&&j==c)    
  33.         {    
  34.             printf("YES\n");    
  35.             continue;  
  36.         }    
  37.     
  38.         for(i=0;i<c;i++)    
  39.             for(j=0;j<c;j++)    
  40.             {    
  41.                 if(a[i][j]!=b[j][c-i-1]){break;}    
  42.             }    
  43.     
  44.         if(i==c&&j==c)    
  45.         {    
  46.         printf("YES\n");    
  47.         continue;    
  48.         }    
  49.     
  50.         for(i=0;i<c;i++)    
  51.             for(j=0;j<c;j++)    
  52.             {    
  53.                 if(a[i][j]!=b[c-i-1][c-j-1]){break;}    
  54.             }    
  55.     
  56.         if(i==c&&j==c)    
  57.         {    
  58.         printf("YES\n");    
  59.         continue;    
  60.         }    
  61.     
  62.         for(i=0;i<c;i++)    
  63.             for(j=0;j<c;j++)    
  64.             {    
  65.                 if(a[i][j]!=b[c-j-1][i]){break;}    
  66.             }  
  67.   
  68.         if(i==c&&j==c)    
  69.         {    
  70.            printf("YES\n");    
  71.            continue;    
  72.         }    
  73.         printf("NO\n");    
  74.     }    
  75.     
  76. }      

2.字母矩阵:

先给出一道例题:

ACM例题:[2254]

题目描述

给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A至Z的26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过26时又从A开始填充。例如,当M=5,N=8时,矩阵中的内容如下:

 A B C D E F G H
 V W X Y Z A B I
 U J K L M N C J
 T I H G F E D K
 S R Q P O N M L
 

输入

M为行数,N为列数,其中M,N都为大于0的整数。

输出

分行输出相应的结果,注意每行开始有1个空格,相邻两个字母之间有1个空格。

示例输入

4 9

示例输出

 A B C D E F G H I
 V W X Y Z A B C J
 U J I H G F E D K
 T S R Q P O N M L

代码:

[objc]  view plain  copy
  1. #include <stdio.h>  
  2.   
  3. void main()  
  4. {  
  5.     int M;  
  6.     int N;  
  7.     int flag=0;  
  8.     int num1=0;  
  9.     int num2=1;  
  10.     int i=0;  
  11.     int j=0;  
  12.     char str='A';  
  13.     char Array[31][31];  
  14.   
  15.     scanf("%d%d",&M,&N);  
  16.     Array[0][0]=str;  
  17.     while(flag < M*N-1)  
  18.     {  
  19.                 switch(num2%4)  
  20.             {  
  21.                                 case 1:  
  22.                         ++j;  
  23.                                         if(j == N-num1-1)  
  24.                         {  
  25.                                 num2++;  
  26.                         }  
  27.                         break;  
  28.                 case 2:  
  29.                         ++i;  
  30.                     if(i == M-num1-1)  
  31.                     {  
  32.                         num2++;  
  33.                     }  
  34.                     break;  
  35.                         case 3:  
  36.                     --j;  
  37.                                         if(j == num1)  
  38.                     {  
  39.                             num2++;  
  40.                     }  
  41.                     break;  
  42.                 case 0:  
  43.                     --i;  
  44.                         if(i == num1+1)  
  45.                     {  
  46.                     num2++;  
  47.                     num1++;  
  48.                     }  
  49.                         break;  
  50.                 }  
  51.   
  52.                 if(++str == 'Z'+1)  
  53.                         str='A';  
  54.   
  55.                 Array[i][j]=str;  
  56.                 flag++;  
  57.   
  58.         }  
  59.   
  60.         for(i=0;i<M;i++)  
  61.         {  
  62.                 printf(" ");  
  63.                 for(j=0;j<N;j++)  
  64.                 {  
  65.                     if(j!=N-1)  
  66.                         printf("%c ",Array[i][j]);  
  67.                         else   
  68.                         printf("%c",Array[i][j]);  
  69.                 }  
  70.                 printf("\n");  
  71.   
  72.         }  
  73.   
  74. }  

规律:从代码中我们不难看出只要利用好顺时针循环的规律便可以成功打印出字母矩阵。

原博主:http://blog.csdn.net/daijingxin/article/details/51991984

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值