矩阵问题(题目:SDUT 2744 2254)
2016-07-22 11:29
429 查看
最近在刷ACM题目的过程中遇到了好多关于矩阵的问题,确实是把我恶心了一番。
但是从本质上来讲,这种题目难度并不是很大,主要是找规律,之后通过循环来实现。
出这种题的原因也很好找,因为矩阵中元素的位置和二维数组的两个下标都很相似,所以两者之间很多时候都可以进行代换。
现在主要介绍一下几种规律和题目:
1.矩阵的旋转:
矩阵的逆时针旋转基本有四种情况:
0度
90度
180度
270度,相当于顺向的90度
(n - 行号 - 1)变成列号
规律: a[i][j] = b[j][n - i - 1]
(m- 列号 + 1)变为列号
规律:a[i][j] = b[n - i - 1][m - j - 1]
(m - 列号 + 1)变为行号
规律:a[i][j] = b[m - j -1][i]
注意:其中n,m分别为原来矩阵的行数和列数。
ACM例题:[2744]
每组输入先输入一个整数N(N <= 50),代表矩阵的大小。
接下来的N行,每行有N个整数。代表矩阵A。
再接下来的N行N个整数代表矩阵B。
2.字母矩阵:
先给出一道例题:
ACM例题:[2254]
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
代码:
规律:从代码中我们不难看出只要利用好顺时针循环的规律便可以成功打印出字母矩阵。
但是从本质上来讲,这种题目难度并不是很大,主要是找规律,之后通过循环来实现。
出这种题的原因也很好找,因为矩阵中元素的位置和二维数组的两个下标都很相似,所以两者之间很多时候都可以进行代换。
现在主要介绍一下几种规律和题目:
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"); } }
规律:从代码中我们不难看出只要利用好顺时针循环的规律便可以成功打印出字母矩阵。
相关文章推荐
- python csdn增加访问量
- 网易云捕1.5版本已经上线,重磅功能来袭
- etcd集群一键安装运行
- 大型网站应用中MySQL的架构演变史
- XML DOM 节点
- Java-并发和并行的区别
- MySQL 5.6 设置慢日志, 无法启动
- HTTPS和HTTP的区别
- 二叉树的基本概念和遍历
- 组件用户控件引用样式资源(二)---代码引用
- Redis 和 Memcached 的区别
- 消息结构体MSG
- [刷题]算法竞赛入门经典 3-12/UVa11809
- [置顶] Android6.0动态权限
- oracle命令sqlplus/nolog无法进入
- tomcat不支持中文路径(链接)的解决办法
- 数论基础1010 UVA 11426
- 根号2的小数点后100位
- ArcGIS Desktop 10.3 破解安装简明教程(支持32/64位+下载地址+亲测可用)
- 设计模式学习笔记(五):工厂方法模式