关键:如何实现对每个点判断是否为0
利用状态数组st[N][N]判断是否为0。
是的条件为:当前点上下左右存在最长连续序列长度>=3。
如何找到上下左右最长连续长度?
利用指针变量l(往左走),r(往右走),w(往上走),d(往下走),只要符合相等就一直走,直到碰到上下左右边界中止。
//判断每个格子能不能删,往右一直走和往下一直走,可以flag=1; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++)//利用上下左右指针一直走,直到不同之后计算r-l+1和d-w+1是不是大于等于3是的话当前数据可为0 { int l,r,d,w,x; l=j;r=l;d=i;w=i;x=a[i][j]; while(l>1&&a[i][l-1]==x) { l--; } while(r<m&&a[i][r+1]==x) { r++; } while(w>1&&a[w-1][j]==x) { w--; } while(d<n&&a[d+1][j]==x) { d++; } if(r-l+1>=3){ st[i][j]=true; } if(d-w+1>=3) { st[i][j]=true; } }
#include <bits/stdc++.h>
using namespace std;
const int N=35;
int a[N][N];
bool st[N][N];
int main()
{
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
//判断每个格子能不能删,往右一直走和往下一直走,可以flag=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)//利用上下左右指针一直走,直到不同之后计算r-l+1和d-w+1是不是大于等于3是的话当前数据可为0
{
int l,r,d,w,x;
l=j;r=l;d=i;w=i;x=a[i][j];
while(l>1&&a[i][l-1]==x)
{
l--;
}
while(r<m&&a[i][r+1]==x)
{
r++;
}
while(w>1&&a[w-1][j]==x)
{
w--;
}
while(d<n&&a[d+1][j]==x)
{
d++;
}
if(r-l+1>=3){
st[i][j]=true;
}
if(d-w+1>=3)
{
st[i][j]=true;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(st[i][j])
{
cout<<0<<" ";
}
else
{
cout<<a[i][j]<<" ";
}
}
cout<<endl;
}
return 0;
}