[洛谷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;
	}
}



posted @ 2018-01-11 16:08  溡沭  阅读(359)  评论(0编辑  收藏  举报