P1162 填涂颜色(bfs)

填涂颜色 - 洛谷

题解:

先把题目给的n*n的矩阵外面加一圈0(不需要进行特殊操作,只需在读入的时候i=1,j=1即可),然后bfs(0,0)搜外围连通0的连通块,并标记上,这样圈内的0没标记的就输出2,圈外标记的0输出0;

#include
using namespace std;
const int N=40;
typedef pairPII;
int dx[]={-1,1,0,0},dy[]={0,0,1,-1};
int g[N][N],st[N][N];
int n;
void bfs(int x,int y)
{
    queueq;
    q.push({x,y});
    st[x][y]=1;
    while(q.size())
    {
        auto t=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int sx=t.first+dx[i],sy=t.second+dy[i];
            if(st[sx][sy])continue;
            if(sx<0||sx>n+1||sy<0||sy>n+1)continue;
            if(g[sx][sy]==1)continue;
            st[sx][sy]=1;
            q.push({sx,sy});
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            scanf("%d",&g[i][j]);
        }
    }
    bfs(0,0);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(g[i][j]==1)
                printf("1 ");
            else if(g[i][j]==0&&st[i][j])//被标记属于圈外的输出0
                printf("0 ");
            else//没被标记的属于圈内
                printf("2 ");
        }
        printf("\n");
    }
}

你可能感兴趣的:(宽度优先,算法)