思路很简单,二维数组保存值和每个值的标记位,分别按行按列扫描,有连续3个数相同,则置标记位为0,最后遍历数组时删除。
#include<bits/stdc++.h>
using namespace std;
struct xxl{
int value;
int flag; //flag=0为置零标记
}a[30][30];
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].value;
a[i][j].flag=1;
}
}
for(int i=0;i<n;i++){ //先按行判断
int j=0;
while(j<m-2){ //只有不少于连续三个数相同时 将其flag置零
if(j<m-2&& a[i][j].value==a[i][j+1].value
&& a[i][j+1].value==a[i][j+2].value
&& a[i][j].value==a[i][j+2].value){
a[i][j].flag=0;
a[i][j+1].flag=0;
a[i][j+2].flag=0;
}
j++; //换列
}
}
for(int j=0;j<m;j++){ //再按列判断
int i=0;
while(i<n-2){
if(i<n-2&&a[i][j].value==a[i+1][j].value&&
a[i+1][j].value&&a[i+2][j].value&&
a[i][j].value==a[i+2][j].value){
a[i][j].flag=0;
a[i+1][j].flag=0;
a[i+2][j].flag=0;
}
i++;
}
}
for(int i=0;i<n;i++){ //输出
for(int j=0;j<m;j++){
if(a[i][j].flag==0) a[i][j].value=0;
cout<<a[i][j].value<<" ";
}
cout<<endl;
}
return 0;
}
欢迎指导交流。