神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等。加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠 11 号要征服各个海岛的海盜,最后成为海盗王。
这是一个由海洋、岛屿和海盗组成的危险世界。面对危险重重的海洋与诡谲的对手,如何凭借智慧与运气,建立起一个强大的海盗帝国。
杰克船长手头有一张整个海域的海图,上面密密麻麻分布着各个海屿的位置及面积。他想尽快知道整个海域共有多少岛屿以及最大岛屿的面积。
输入格式
第 11 行:MM,NN,TT,表示海域的长,宽及一个单位表示的面积大小
接下来有 MM 行 ,每行有 NN 个 0101 组成的序列以及其中穿插一些空格。00 表示海水,11 表示陆地,其中的空格没用,可以忽略掉。
输出格式
输出一行,有 22 个整数,一个空格间隔,表示整个海域的岛屿数,以及最大岛屿的面积。
提示
1:若一个陆地八个方向之一(上、下、左、右、左上、右上、左下、右下)的位置也是陆地,则视为同一个岛屿。
2:假设第一行,最后一行,第一列,最后一列全为 00。
数据范围
1 \le N,M,T \le 5001≤N,M,T≤500。
输出时每行末尾的多余空格,不影响答案正确性
样例输入复制
8 16 99
00000000 00000000
0000110011000000
0001111000111000
0000000 00 0000000
00111 111000001 10
001110000 0000000
0100001111 111100
0000000000000000
样例输出复制
5 990
比较明显的一个搜索题目,我们只需要在每次遍历的时候,更新这个岛屿的最大面积即可,同时注意关键点就是,在广搜的时候,入队依次,那么面积就加一次
//@author:hairu,wu
//@from:ahut
#include<iostream>
#include<queue>
#include<memory.h>
using namespace std;
int maze[600][600];
int n,m,t;
int visited[600][600];
int ans=0;
int go[][2]={
-1,-1,
-1,0,
-1,1,
0,-1,
0,1,
1,-1,
1,0,
1,1
};
struct point{
int x;
int y;
};
void bfs(int x,int y){
int num=1;
queue<point> q;
point p;
p.x=x;
p.y=y;
q.push(p);
while(!q.empty()){
point newP=q.front();
q.pop();
for(int i=0;i<8;i++){
int dx=newP.x+go[i][0];
int dy=newP.y+go[i][1];
if(dx<1 ||dx>n || dy<1||dy>m) continue;
if(visited[dx][dy]) continue;
if(maze[dx][dy]==0) continue;
p.x=dx;
p.y=dy;
visited[dx][dy]=true;
q.push(p);
num++;//入队一次,表示该岛屿面积加1
}
}
ans=max(ans,num);//更新ans的值
return ;
}
int main(){
//读入
cin >> n>> m>> t;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%1d",&maze[i][j]);
}
}
//广搜
memset(visited,false,sizeof(visited));
int cnt=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(maze[i][j]==1 && !visited[i][j]){
visited[i][j]=true;
cnt++;
bfs(i,j);
}
}
}
//输出结果
cout<<cnt<<" "<<ans*t<<endl;
return 0;
}