面积
面积
思路:实际与填涂颜色差不多
建立数组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;
}

浙公网安备 33010602011771号