[洛谷oj1162]填涂颜色(bfs)
由数字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的完整方阵。
输入样例
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
今天的解题报告有点水啊,一道很裸的bfs,但要分清是在圈外还是圈内需要一些量的代码,所以我想了一个有点妙的解法。在地图的外面围一圈‘0’(这个很好实现,数组从1开始并且边界在N+1就好),从不在地图上的一个点‘0’开始广搜,把能遍历到的点(不能走到1)都打标记如果最后某个等于1的点没有被打标记并且不等于1,它就一定是在圈子里的节点,那我们输出2就好。
那我就放代码了
#include<iostream>
#include<queue>
#include<cstdlib>
using namespace std;
int N;
const int dir_x[4]={1,-1,0,0};
const int dir_y[4]={0,0,1,-1};//骚操作,不懂的可以留言
int map[32][32];
bool visit[32][32];//visit和map应该可以合并我为了代码的正确性(其实是懒得改了),就不改了,留给读者来简化。
struct node{
int x;
int y;
};//方便使用stl的queue模板
void bfs()
{
queue<node>que;
node start;
start.x=0;
start.y=0;
que.push(start);
visit[0][0]=1;
while(!que.empty())//bfs模板
{
node now=que.front();
que.pop();
for(int i=0;i<4;i++)
{
int x=now.x+dir_x[i];
int y=now.y+dir_y[i];
if(x>=0&&x<=N+1&&y>=0&&y<=N+1&&map[x][y]!=1&&visit[x][y]!=1)
{
flag[x][y]=1;
node neww;
neww.x=x;
neww.y=y;
que.push(neww);
visit[x][y]=1;
}
}
}
}
int main()
{
cin>>N;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
cin>>map[i][j];
}
}
bfs();
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
if(flag[i][j]!=1&&map[i][j]!=1)
{
cout<<2<<" ";
}
else
{
cout<<map[i][j]<<" ";
}
}
cout<<endl;
}
}