洛谷-P1162-填涂颜色

本文介绍了如何使用广度优先搜索算法解决二维空间中染色问题,标记边界1,将1包围之外的0染成1,其余区域染成2,展示了从输入矩阵到输出结果的处理过程。
摘要由CSDN通过智能技术生成

//宽搜染色
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
typedef pair<int,int> PII;		//使用pair类型来存储坐标

const int N = 35;
const int dx[4] = {0,1,0,-1};
const int dy[4] = {1,0,-1,0};
int g[N][N];
bool vis[N][N];
int n;

void bfs(){

    queue< PII >q;
    vis[0][0] = true;		//先把0,0点存入,从此处开始宽搜
    q.push(PII(0,0));

    while(q.size()){
        PII t = q.front();
        q.pop();

        for(int i = 0;i < 4;i++){
            int xx = t.first + dx[i],yy = t.second + dy[i];

            if(xx>=0&&xx<=n+1&&yy>=0&&yy<=n+1&&vis[xx][yy]==false){	//此处一定要比存的图多扫一圈,因为可能出边缘1包围0,使得0被扫不到的情况
                q.push(PII(xx,yy));
                g[xx][yy] = 1;			//如果搜到1包围之外的0,则染成1
                vis[xx][yy] = true;
            }
        }
    }

}

int main(){
    cin >> n;
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= n;j++){
            cin >> g[i][j];
            if(g[i][j] == 1){
                vis[i][j] = true;	//标记上此点,代表边界1是不能走的
                g[i][j] = 3;		//把所有的边界1变成3,以和染色后的1区分
            }
        }
    }

    bfs();

    for(int i = 1;i <= n;i++){			//根据染色结果来输出答案
        for(int j = 1;j <= n;j++){
            if(g[i][j] == 1)cout << "0 ";	//如果被搜到染成1,则这是个1包围之外的0
            if(g[i][j] == 3)cout << "1 ";	//如果是3,那么代表这是个边界
            if(g[i][j] == 0)cout << "2 ";	//如果没有被搜到,则代表是1包围之内的,则依据题目变成2
        }
        puts("");
    }

    return 0;
}

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值