广度优先搜索——填涂颜色

来源:互联网 发布:知乎 宋慈 编辑:程序博客网 时间:2024/05/01 06:42

前排提示
壮哉我大C党
洛谷 P1162 填涂颜色
题目描述
由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和涂色后的方阵如下:
0 0 0 0 0 0| 0 0 0 0 0 0
0 0 1 1 1 1| 0 0 1 1 1 1
0 1 1 0 0 1| 0 1 1 2 2 1
1 1 0 0 0 1| 1 1 2 2 2 1
1 0 0 0 0 1| 1 2 2 2 2 1
1 1 1 1 1 1| 1 1 1 1 1 1
因为看着不方便所以在中间加了横线以便区分

分析
和曾经的OIBH总部相当相像,不过还要将被围住的地方涂上“2”而已
加一个数组即可(标记所有走过的地方),最后依照该数组输出(什么?0和1怎么办?原数组即可解决(即若B[i]<>0就照原数组输出,反之就会了吧?))

#include<iostream>using namespace std;int a[30][30];int b[30][30];int s[900][2];int dx[5];int dy[5];int n;void init(){    int i,j;    cin>>n;    for (i=1;i<=n;i++)     for (j=1;j<=n;j++)       {          cin>>a[i][j];          b[i][j]=a[i][j];      }    dx[1]=1;dx[2]=-1;dx[3]=0;dx[4]=0;    dy[3]=1;dy[4]=-1;dy[1]=0;dy[2]=0;    return;}void bfs(int x,int y){    int t,h,i;    t=1;h=0;b[x][y]=1;s[1][1]=x;s[1][2]=y;    do    {        h++;        for (i=1;i<=4;i++)         if (s[h][1]+dx[i]>=1&&s[h][1]+dx[i]<=n&&s[h][2]+dy[i]>=1&&s[h][2]+dy[i]<=n)          if (b[s[h][1]+dx[i]][s[h][2]+dy[i]]==0)          {              t++;              s[t][1]=s[h][1]+dx[i];              s[t][2]=s[h][2]+dy[i];              b[s[t][1]][s[t][2]]=1;          }    }    while (h<t);    return;}void doit(){    int i,j;    for (i=1;i<=n;i++)      {         if (b[i][1]!=1) bfs(i,1);         if (b[i][n]!=1) bfs(i,n);         if (b[1][i]!=1) bfs(1,i);         if (b[n][i]!=1) bfs(n,i);     }    for (i=1;i<=n;i++)     {         for (j=1;j<=n;j++)         if (b[i][j]==0) cout<<2<<" ";          else cout<<a[i][j]<<" ";        cout<<endl;     }    return;}int main(){    init();    doit();    return(0);}
1 0