思路:
因为一个点可以同时被横竖方向消除,也可以同时被3个及以上消除,所以我们不能在原图上直接消除点,得先做一个可以消除的标记。
然后遍历 满足条件即可标记为消除。
代码:
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn=35;
int a[maxn][maxn],b[maxn][maxn];
int n,m;
int main()
{
scanf("%d %d",&n,&m);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
scanf("%d",&a[i][j]);
b[i][j]=1; //全部标记为不可消除
}
}
//横向遍历
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m-2; j++)
{
if(a[i][j]==a[i][j+1]&&a[i][j+1]==a[i][j+2])
{ //横着的三个 可以 即可标记
b[i][j]=b[i][j+1]=b[i][j+2]=0;
}
}
}
//竖向遍历
for(int i=1; i<=n-2; i++)
{
for(int j=1; j<=m; j++)
{
if(a[i][j]==a[i+1][j]&&a[i+1][j]==a[i+2][j])
{ //竖着的三个 标记
b[i][j]=b[i+1][j]=b[i+2][j]=0;
}
}
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(j==m)
{
if(b[i][j]==0) //被标记 输出0
printf("%d",b[i][j]);
else
printf("%d",a[i][j]); //否则输出原数
}
else
{
if(b[i][j]==0)
printf("%d ",b[i][j]);
else
printf("%d ",a[i][j]);
}
}
if(i!=n)
printf("\n");
}
return 0;
}