我不用bfs也不用dfs,直接暴力判断鬼知道我还耗费了多少下测试点的机会一行一行的枚举,个人感觉时间复杂度不是很高,啥也不说了直接贴代码(看看那位巨佬能看懂我的代码)
#include<bits/stdc++.h>
using namespace std;
int a[31][31],n;
int pd(int x,int y)
{
int i,j;
for(j=y;j<=n;j++)
if(a[x][j]==1)
return 1;
return 0;
}
int pd2(int x,int y)
{
int i,j;
for(i=x;i<=n;i++)
if(a[i][y]==1)
return 1;
return 0;
}
int pd3(int x,int y)
{
int i,j;
for(i=x;i>=1;i--)
if(a[i][y]==1)
return 1;
return 0;
}
int pd4(int x,int y)
{
int i,j;
for(j=y;j>=1;j--)
if(a[x][j]==1)
return 1;
return 0;
}
int check(int x,int y)
{
if(a[x][y]==2 && (a[x+1][y]==0 || a[x][y+1]==0 || a[x-1][y]==0 || a[x][y-1]==0))
return 1;
return 0;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int i,j;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
//cout<<endl;
for(i=2;i<=n;i++)
{
int flag=0;
for(j=1;j<=n;j++)
{
int x=0;
if(flag==2 && a[i][j]==1 && a[i][j-1]!=1)
{
flag=0;x=2;
}
if(flag==0 && a[i][j]==1)
{
flag=2;x=1;
}
else if(flag==2 && a[i][j]!=1 && i<n && j<n)
{
if(pd(i,j)==1 && pd2(i,j)==1 && pd3(i,j)==1 && pd4(i,j)==1)
{
a[i][j]=2;x=3;
}
}
//printf("a[%d][%d]:%d\n",i,j,x);
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(check(i,j)==1)
{
a[i][j]=0;
}
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}