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

前排提示
壮哉我大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
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 (hreturn;
}

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<" ";
        cout<return;
}

int main()
{
    init();
    doit();
    return(0);
}

你可能感兴趣的:(广度优先搜索——填涂颜色)