题目描述
算法设计+题目分析
分析题目:
题目给予的是一个数字矩阵,
1、可建立一个副本矩阵R;
2、通过判断原矩阵G中的元素的上两格、下两格、左两格、右两格、左右、上下,这六种情况中是否存在消除情况;
3、对副本矩阵R进行赋值(出现了六种情况中的一种,就为0,否则为原矩阵G中的值),G不变。
4、按照正常格式打印矩阵。
注意点+记录点
memset只能初始化数组为0或者-1
代码(100分)
环境
Visual C++6.0
#include <stdio.h>
#include <string.h>
int G[32][32]={0};//初始化原矩阵G为0
int main(){
//freopen("C:\\input.txt", "r", stdin);
int n,m;
int R[32][32];
memset(R,-1,sizeof(R));//初始化副本矩阵R为-1
scanf("%d %d", &n, &m);
for (int y=n-1; y>=0; y--){//输入原矩阵G
for (int x=0; x<m; x++){
scanf("%d", &G[x][y]);
}
}
for (int i=n-1; i>=0; i--){
for (int j=0; j<m; j++){//对原矩阵的每个元素进行6中情况判定
if (j+1<m && j+2<m){//右边两个存在
if (G[j][i]==G[j+1][i] && G[j][i]==G[j+2][i]){
R[j][i]=0;
}
}
if (j-1>=0 && j-2>=0){//左边两个存在
if (G[j][i]==G[j-1][i] && G[j][i]==G[j-2][i]){
R[j][i]=0;
}
}
if (j-1>=0 && j+1<m){//左右两个存在
if (G[j][i]==G[j-1][i] && G[j][i]==G[j+1][i]){
R[j][i]=0;
}
}
if (i+1<n && i+2<n){//上面两个存在
if (G[j][i]==G[j][i+1] && G[j][i]==G[j][i+2]){
R[j][i]=0;
}
}
if (i-1>=0 && i-2>=0){//下面两个存在
if (G[j][i]==G[j][i-1] && G[j][i]==G[j][i-2]){
R[j][i]=0;
}
}
if (i+1<n && i-1>=0){//上下两个存在
if (G[j][i]==G[j][i+1] && G[j][i]==G[j][i-1]){
R[j][i]=0;
}
}
if (R[j][i] == -1) R[j][i]=G[j][i];//6种情况判定均不成功
}
}
for (int yy=n-1; yy>=0; yy--){//副本矩阵R打印
for (int xx=0; xx<m; xx++){
if (xx!=m-1) printf("%d ", R[xx][yy]);
else printf("%d", R[xx][yy]);
}
if (yy!=0) printf("\n");
}
return 0;
}
感谢链接
无