计蒜客-1405-最大岛屿(bfs)

神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等。加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠 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;
}
发布了83 篇原创文章 · 获赞 3 · 访问量 1362

猜你喜欢

转载自blog.csdn.net/weixin_41296877/article/details/105253444