矩阵的转置(C)

题目要求:

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

规律:

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分别为原来矩阵的行数和列数。

代码

***:

#include<stdio.h>  
#include<math.h>  
 
int main()  
{  
    int i,j;  
    int a[50][50],b[50][50];  
    int c;  
    int d=1;  
  
    while(scanf("%d",&c)!=EOF)  //控制多组输入Ctrl+z可以终止多组输入
    {  
  
        for(i=0;i<c;i++)  
            for(j=0;j<c;j++)  
            {  
                scanf("%d",&a[i][j]);  
            }  
  
        for(i=0;i<c;i++)  
            for(j=0;j<c;j++)  
            {  
                scanf("%d",&b[i][j]);  
            }    
  
        for(i=0;i<c;i++)  
            for(j=0;j<c;j++)  
            {  
                if(a[i][j]!=b[i][j]){break;}  //不旋转
            }  
  
        if(i==c&&j==c)  
        {  
            printf("YES\n");  
            continue;
        }  
  
        for(i=0;i<c;i++)  
            for(j=0;j<c;j++)  
            {  
                if(a[i][j]!=b[j][c-i-1]){break;}  //逆时针转90°
            }  
  
        if(i==c&&j==c)  
        {  
        printf("YES\n");  
        continue;  //退出此次循环,进入下一次循环(注意break是终止循环)
        }  
  
        for(i=0;i<c;i++)  
            for(j=0;j<c;j++)  
            {  
                if(a[i][j]!=b[c-i-1][c-j-1]){break;}  //逆时针转180°
            }  
  
        if(i==c&&j==c)  
        {  
        printf("YES\n");  
        continue;  
        }  
  
        for(i=0;i<c;i++)  
            for(j=0;j<c;j++)  
            {  
                if(a[i][j]!=b[c-j-1][i]){break;}  //逆时针转270°
            }
 
        if(i==c&&j==c)  
        {  
           printf("YES\n");  
           continue;  
        }  
        printf("NO\n");  
    }  
  
}    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值