面积

面积

思路:实际与填涂颜色差不多

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

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

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

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

最后找没有被标记且值为0的(自然就是被1围起来的那部分),用计数器sum记录,最后输出sum就行。

代码如下:

#include<iostream>

#include<queue>

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

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

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

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

int sum=0;

 

using namespace std;

int main()

{

     int n=10;

     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)//新的点在边界内且没被访问过

              {

                   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且没有被访问过

                sum++;

     cout<<sum<<endl;

     return 0;    

}

posted @ 2022-08-24 21:43  shanyingrui  阅读(91)  评论(0编辑  收藏  举报