矩阵问题(题目:SDUT 2744 2254)

4 篇文章 0 订阅

        最近在刷ACM题目的过程中遇到了好多关于矩阵的问题,确实是把我恶心了一番。

        但是从本质上来讲,这种题目难度并不是很大,主要是找规律,之后通过循环来实现。

        出这种题的原因也很好找,因为矩阵中元素的位置和二维数组的两个下标都很相似,所以两者之间很多时候都可以进行代换。

       

        现在主要介绍一下几种规律和题目:

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

代码:

#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)  
    {  
  
        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;}  
            }  
  
        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-i-1][c-j-1]){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[c-j-1][i]){break;}  
            }

        if(i==c&&j==c)  
        {  
           printf("YES\n");  
           continue;  
        }  
        printf("NO\n");  
    }  
  
}    

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

代码:

#include <stdio.h>

void main()
{
	int M;
	int N;
	int flag=0;
	int num1=0;
	int num2=1;
	int i=0;
	int j=0;
	char str='A';
	char Array[31][31];

	scanf("%d%d",&M,&N);
	Array[0][0]=str;
	while(flag < M*N-1)
	{
                switch(num2%4)
			{
                                case 1:
				        ++j;
                                        if(j == N-num1-1)
				        {
	   			                num2++;
				        }
				        break;
				case 2:
				        ++i;
					if(i == M-num1-1)
					{
						num2++;
					}
					break;
               			case 3:
					--j;
                                        if(j == num1)
					{
	         				num2++;
					}
					break;
				case 0:
					--i;
				        if(i == num1+1)
					{
					num2++;
					num1++;
					}
				        break;
				}

				if(++str == 'Z'+1)
						str='A';

				Array[i][j]=str;
				flag++;

		}

		for(i=0;i<M;i++)
		{
				printf(" ");
				for(j=0;j<N;j++)
				{
					if(j!=N-1)
						printf("%c ",Array[i][j]);
		          		else 
						printf("%c",Array[i][j]);
				}
				printf("\n");

		}

}

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



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daijingxin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值