一、题目
二、解题
1.思路
主要思路是判断输入的一个n行m列的二维数组a中是否存在连续的四个相同的数字,若存在就将这四个数字置为0,最后输出修改后的二维数组。主要变量的含义如下:
- int n,m:表示输入的二维数组a的行数和列数。
- int a[35][35]:表示输入的二维数组。
- bool b[35][35]:用于判断a中的每个数字是否需要修改,若需要修改则将对应的b数组中的值置为true。
- int i,j,s,x,z,y:这些变量用于遍历a数组和查找相同数字。其中,i和j表示当前遍历到的位置的行和列,s,x,z,y分别表示查找当前位置所在行或列中相同数字的起始位置和结束位置。
具体的操作流程:
-
读入n和m。
-
用两个嵌套的for循环读入二维数组a。
-
使用两个嵌套的for循环遍历数组a,对于数组中的每一个位置,分别向上、下、左、右查找是否有相同数字,查找的过程中记录下起始位置和结束位置,并判断相邻起始位置和结束位置之间的数字个数是否大于等于4,如果大于等于4,则将对应的b数组中的值置为true。
-
再次遍历数组a,对于每个位置,如果对应的b数组中的值为true,则输出0,否则输出该位置的原值。输出完一行后换行。
-
返回0,结束程序。
2.代码
dev c++ 5.11
#include<iostream>
using namespace std;
const int N=35;
int a[N][N];
bool b[N][N];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
int s=i,x=i,z=j,y=j;
while(s>=0 && a[s][j]==a[i][j]) s--;
while(x<n && a[x][j]==a[i][j]) x++;
while(z>=0 && a[i][z]==a[i][j]) z--;
while(y<m && a[i][y]==a[i][j]) y++;
if(x-s>=4 || (y-z)>=4 ) b[i][j]=true;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(b[i][j]){
cout<<0<<" ";
}else{
cout<<a[i][j]<<" ";
}
}
cout<<endl;
}
return 0;
}
3.提交结果
总结
模拟题,这里用的是暴力解。