洛谷P1162 填涂颜色(bfs)

https://www.luogu.org/problem/P1162

思路:将图从1-n存起来,外面一圈用0填充,然后从(0,0)开始搜

// luogu-judger-enable-o2
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <cstring>
#include <map>
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long lll;
const int maxn = 200005;
const lll INF = 0x3f3f3f3f3f;
int dir[8][2]= {0,1,0,-1,1,0,-1,0,-1,-1,1,-1,-1,1,1,1};
int dir2[4][2]= {0,1,0,-1,1,0,-1,0};
bool flag;
int a[35][35],b[35][35],n;
struct node{
    int x,y;
    node(){};
    node(int xx,int yy):x(xx),y(yy){};
};

void bfs(int x,int y)
{
    queue<node>q;
    q.push(node(0,0));//(0,0)一定是0
    while(!q.empty()){
        int fx = q.front().x,fy = q.front().y;
        q.pop();
        b[fx][fy] = 3;//将圈外的0标记为3
        for(int i=0;i<4;i++)
        {
            int ex = fx + dir2[i][0],ey = fy + dir2[i][1];
            if(ex < 0 || ex > n+1 || ey < 0 || ey > n + 1 || b[ex][ey] == 1 || b[ex][ey] == 3)
                continue;
            q.push(node(ex,ey));
        }
    }
}
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    for(int j = 1; j <= n; j++){
        cin >> a[i][j];
        if(a[i][j] == 0) b[i][j] = 2;
        else b[i][j] = 1;
    }
    bfs(0,0);
    for(int i = 1; i <= n; i++){
        for(int j =1; j <= n; j++){
            if(b[i][j] == 3 ) cout << "0";
        else
                cout << b[i][j];
            if(j < n) cout << " ";
            else cout << endl;
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/LLLAIH/p/11294038.html