填涂颜色

填涂颜色

思路: 建立数组xx和数组yy, 分别表示每一次操作横纵坐标的对应长度。

将输入的方阵外面加上一圈0,第一个入队.

然后从涂色的最开始(队首)向周围扩展,若扩展到的点在棋盘里且没有被搜到标记过,就入队并标记。

当队首向外扩展完了,让当前队首出队,再由下一个队首继续向外扩展寻找.

输出时分2种情况输出.一种是如果没被访问且值为0,输出2;剩下的输出它本身的值。

代码如下:

#include<iostream>

#include<queue>

int xx[]={0,-1,0,1};//方向

int yy[]={1,0,-1,0};//xy要对应

int map[40][40];//存数

bool vis[40][40];//记录是否访问过

int n;

 

using namespace std;

int main()

{

     cin>>n;

     for(int i=1;i<=n;i++)//读入方阵

       for(int j=1;j<=n;j++)

         cin>>map[i][j];

     //建队列

     queue<int>x;//横坐标

     queue<int>y;//纵坐标

     x.push(0);y.push(0);//加上一圈0,0开始

     vis[0][0]=1;//记录,防止再访问回来

     while(!x.empty())//队列不为空时

     {

         for(int i=0;i<4;i++)//点对应的四个方向

         {

              int dx=x.front()+xx[i];//队首点对应的4个方向的点的横坐标

              int dy=y.front()+yy[i];//队首点对应的4个方向的点的纵坐标

         if(dx>=0&&dx<=n+1&&dy>=0&&dy<=n+1&&map[dx][dy]==0&&vis[dx][dy]==0)//新的点在边界内且没被访问过,加了一圈0所以边界变大

              {

                   x.push(dx);//把点压进队

                   y.push(dy);

                   vis[dx][dy]=1;//标记

              }

         }

         x.pop();//原来的队首出队

         y.pop();

     }

     for(int i=1;i<=n;i++)

     {

         for(int j=1;j<=n;j++){

         if(map[i][j]==0&&vis[i][j]==0)//值是0且没有被访问过

             cout<<"2";

           else

             cout<<map[i][j];

           cout<<" ";

          }

       cout<<endl;

     }

     return 0;    

}

posted @ 2022-08-24 17:14  shanyingrui  阅读(68)  评论(0编辑  收藏  举报