原题地址:点击打开链接
广度搜索
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#include<queue>
struct Point
{
int x;
int y;
};
using namespace std;
char map[510][510];
int mark[510][510]; //标记该点是否已访问过
int x[8]={-1,-1,-1,0,1,1,1,0},y[8]={-1,0,1,1,1,0,-1,-1}; //八个方向
int m,n;
int bfs(Point pos)
{
int a,b,i,size=0; //size 该岛屿的大小
queue<Point>que;
que.push(pos);
while(!que.empty())
{
Point p=que.front();
que.pop();
size++;
for(i=0;i<8;i++)
{
a=p.x+x[i];
b=p.y+y[i];
if(a>=0 &&a<m&&b>=0&&b<n&&map[a][b]=='1'&&mark[a][b]==0)
{
Point pt;
pt.x=a;
pt.y=b;
que.push(pt);
mark[a][b]=1;
}
}
}
return size;
}
void solve(int &res,int &max)
{
int i,j;
memset(mark,0,sizeof(mark));
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(map[i][j]=='1'&&mark[i][j]==0) //如果该点是陆地并且没有被访问过
{
Point p;
p.x=i;
p.y=j;
mark[i][j]=1;
int size=bfs(p);
max=max>size?max:size; //记录最大的岛屿面积
res++;
}
}
}
int main()
{
int t,i,j,res,max;
while(scanf("%d%d%d",&m,&n,&t)!=EOF)
{
res=0;
max=0;
for(i=0;i<m;i++)
{
getchar();
for(j=0;j<n;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]==' ') //过滤空格
j--;
}
}
solve(res,max); //引用
printf("%d %d\n",res,max*t);
}
return 0;
}