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;
    	}
    }
    



  • 相关阅读:
    php集成开发环境搭建三种方式
    阿里云服务器ftp连接后21端口无法使用的问题
    Linux CentOS7 安装FTP服务器
    WIN10分盘
    转载:常见的正则表达式
    转载:什么是分布式系统中的幂等性
    会员通过消费攒积分,升级RENEW以及降级的需求
    CASSANDRA How to import and export data
    tmp for cassandra batch delete
    SQL Insert Case When Update
  • 原文地址:https://www.cnblogs.com/sherrlock/p/9525792.html
Copyright © 2011-2022 走看看