矩阵问题(题目:SDUT 2744 2254)
来源:互联网 发布:java和jsp分页查询 编辑:程序博客网 时间:2024/05/17 20:24
最近在刷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]
ACM例题:[2744]
题目描述
X终于开始玩一些比较高大上的东西了,比如矩阵。给出两个N*N的矩阵A,B。他想知道矩阵A在顺时针旋转一定角度后是否会和矩阵B完全一样。
输入
有多组输入。
每组输入先输入一个整数N(N <= 50),代表矩阵的大小。
接下来的N行,每行有N个整数。代表矩阵A。
再接下来的N行N个整数代表矩阵B。
输出
如果矩阵A在旋转一定角度后能和矩阵B完全一样则输出YES,否则输出NO。
示例输入
21 23 43 14 221 23 44 23 1
示例输出
YESNO
代码:
#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");}}
规律:从代码中我们不难看出只要利用好顺时针循环的规律便可以成功打印出字母矩阵。
0 0
- 矩阵问题(题目:SDUT 2744 2254)
- sdut离散题目11
- sdut离散题目13
- sdut离散题目14
- SDUT-离散题目13
- SDUT-离散题目7
- SDUT离散题目4
- sdut-离散题目3
- sdut- 离散题目4
- sdut-离散题目5
- sdut-离散题目6
- sdut-离散题目7
- sdut-离散题目8
- sdut-离散题目9
- sdut-离散题目10
- sdut-离散题目11
- sdut-离散题目12
- sdut-离散题目13
- 石子合并问题
- KVO底层实现
- linux编程下signal()函数
- ping、ipconfig等不是内部命令
- 50.Pow(x,n)
- 矩阵问题(题目:SDUT 2744 2254)
- Java 内置工具
- 为什么匿名内部类和局部内部类只能访问final类型参数
- 初探FIS3
- Java网络编程 Internet地址
- Java 获取指定字符串出现的次数
- NYOJ44字串和
- java 时间工具类(未测试)
- CADisplayLink的调用足够精确吗?