农民John购买了农场的W x H像素的卫星照片(1<=W<=80,1<=H<=1000),并希望确定最大的“连续”(相连)牧场。当牧场中的任何一对像素都可以通过遍历作为牧场一部分的相邻垂直或水平像素来连接时,牧场是连续的。(很容易创造出形状非常奇怪的牧场,甚至是围绕其他圆圈的圆圈。)
每张照片都经过了数字增强,以星号(‘*’)显示牧场区域,以句点(‘.’)显示非牧场区域。这是一张10 x 5的卫星照片样本:
……**
.…***
.……
….
…*.
这张照片显示了4、16和6个像素的三个连续牧场。帮助FJ在他的每一张卫星照片中找到最大的连续牧场。
输入
*第1行:两个空格分隔的整数:W和H
第2…H+1行:每行包含W个“”或“.”字符,表示卫星照片的一条光栅线。
输出
*第1行:卫星照片中最大的连续场的大小。
把我做哭了,必须记录一下
#include<bits/stdc++.h>
using namespace std;
int n,m,sum;
char a[80][1000];//存放卫星照片信息
struct point
{
int x;
int y;
};
queue<struct point> q;//q都是结构体类型
int ni,nj;
int dx[4]= {0,1,0,-1}; //四方向
int dy[4]= {1,0,-1,0};
void bfs(int i,int j)
{
sum=0;
struct point p;
p.x=i;
p.y=j;
q.push(p);//入队
while(!q.empty()) //q不为空
{
p=q.front();//p来接收
q.pop();//出队
i=p.x;
j=p.y;//求出队元素的坐标
if(a[i][j]=='*')
{
a[i][j]='.';//访问后标记
sum++;
for(int k=0; k<4; k++)
{
ni=i+dx[k];//新坐标
nj=j+dy[k];
if(ni>=1 && ni<=m && nj>=1 && nj<=n && a[ni][nj]=='*')
{
p.x=ni;
p.y=nj;//更新p的坐标
q.push(p);//入队
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);//n列m行
char c;
c=getchar();//吃换行
for(int i=1; i<=m; i++)
{
for(int j=1; j<=n; j++)
scanf(" %c",&a[i][j]);//空格%c是为了忽略掉之前读取的空格、换行符等分隔符。
}
int ma=0;//初始化牧场为0
for(int i=1; i<=m; i++)
{
for(int j=1; j<=n; j++)
{
if(a[i][j]=='*')
{
bfs(i,j);//遍历相邻牧场
if(ma<sum)//记录最大牧场
ma=sum;
}
}
}
printf("%d\n",ma);
return 0;
}