zoukankan      html  css  js  c++  java
  • [洛谷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;
    	}
    }
    



  • 相关阅读:
    javascript获取url参数的代码
    SharePoint最简母版页
    添加 <identity impersonate="true" userName="username" password="password"/>,解决问题!
    使用SPD自定义MOSS导航
    浮动图标代码
    十五种网站最差的用户体验
    div flash firefox div层总是被flash层遮盖
    压缩数据库扩展名为.ldf的日志文件
    版本的签入签出策略
    用CSS制作的圆角层
  • 原文地址:https://www.cnblogs.com/sherrlock/p/9525792.html
Copyright © 2011-2022 走看看