bfs模板题,将1内的0改成2
找到第一个在1内的0就可以了,后来就是把1当做边界。
题目描述
由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和涂色后的方阵如下:
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1
输入输出格式
输入格式:每组测试数据第一行一个整数:n。其中n(1<=n<=30)
接下来n行,由0和1组成的nXn的方阵。
方阵内只有一个闭合圈,圈内至少有一个0。
//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)
输出格式:已经填好数字2的完整方阵。
输入输出样例
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
};
int n;
int vis[35][35];
int mm[35][35];
queue<node >q;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,-1,1};
bool judge(int x,int y)
{
if(mm[x][y]==1)return false;
int x1=0,x2=0,x3=0,x4=0;
for(int i=x+1;i<=n;i++){if(mm[i][y]==1){x1=1;break;}}
for(int i=x-1;i>=1;i--){if(mm[i][y]==1){x2=1;break;}}
for(int i=y+1;i<=n;i++){if(mm[x][i]==1){x3=1;break;}}
for(int i=y-1;i>=1;i--){if(mm[x][i]==1){x4=1;break;}}
if(x1+x2+x3+x4==4)return true;
else return false;
}
void BFS(node e)
{
vis[e.x][e.y]=1;
mm[e.x][e.y]=2;
q.push(e);
node t;
node t1;
while(!q.empty())
{
t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
t1.x=t.x+dx[i];
t1.y=t.y+dy[i];
if(judge(t1.x,t1.y)&&!vis[t1.x][t1.y])
{
//cout<<t1.x<<" "<<t1.y<<endl;
mm[t1.x][t1.y]=2;
vis[t1.x][t1.y]=1;
q.push(t1);
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>mm[i][j];
}
}
node a;
int f=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(judge(i,j)&&mm[i][j]==0)
{
a.x=i;
a.y=j;
f=1;
break;
}
}
if(f)break;
}
BFS(a);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<mm[i][j];
if(j==n)cout<<endl;
else cout<<" ";
}
}
}