B 最大岛屿

题目描述:
神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等。加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠1号要征服各个海岛的海盜,最后成为海盗王。 这是一个由海洋、岛屿和海盗组成的危险世界。面对危险重重的海洋与诡谲的对手,如何凭借智慧与运气,建立起一个强大的海盗帝国。

杰克船长手头有一张整个海域的海图,上面密密麻麻分布着各个海屿的位置及面积。他想尽快知道整个海域共有多少岛屿以及最大岛屿的面积。

输入描述:
第1行:M N T,表示海域的长,宽及一个单位表示的面积大小
接下来有M行 ,每行有N个01组成的序列以及其中穿插一些空格。0表示海水,1表示陆地,其中的空格没用,可以忽略掉。

输出描述:
输出一行,有2个整数,一个空格间隔,表示整个海域的岛屿数,以及最大岛屿的面积

样例输入:

8 16 99
00000000 00000000
0000110011000000
0001111000111000
0000000  00 0000000
00111  111000001  10
001110000  0000000
0100001111 111100
0000000000000000

样例输出:

5 990

这道题思路很简单,但是我有一个细节没注意,因为习惯于循环变量n在上m在下,然后就wrong了。
主要思路就是对图进行dfs,每搜索一次就让临时变量面积++,面积求一个最大值,dfs的次数就是岛屿的个数。
但是对图的记录有些复杂,说说两中方法。
既然输入里面有空格字符无意义,并且数字是连续的,所以只能用字符存放。

第一种:直接用二维字符数组存放,输入到’\n’表示该输入下一行了,输入到空格表示这个字符需要跳过去,不放入数组。

#include<bits/stdc++.h>
using namespace std;
namespace p{
	int max;
}
char g[1500][1500];
int dx[]={1,-1,0,0,-1,1,1,-1};
int dy[]={0,0,-1,1,1,-1,1,-1};
int n,m,t;
int dfs(int x,int y)
{
	g[x][y]='0';
	int res=1;
	for(int i=0;i<8;i++){
		if(x+dx[i]>=0&&x+dx[i]<m&&y+dy[i]>=0&&y+dy[i]<n&&g[x+dx[i]][y+dy[i]]=='1'){
			res+=dfs(x+dx[i],y+dy[i]);
		}
	}
	return res;
}
int main()
{
	cin>>m>>n>>t;
	getchar();
	memset(g,'\0',sizeof(g));
	for(int i=0;i<m;i++){
		for(int j=0;;){
			char ch=getchar();
			if(ch==' ')continue;
			if(ch=='\n')break;
			g[i][j++]=ch;
		}
	}
	p::max=-1;
	int res=0;	
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){		
			if(g[i][j]=='1'){
				int temp=dfs(i,j);
				p::max=max(p::max,temp);
				res++;
			}
		}
	}
	cout<<res<<" "<<p::max*t;
	return 0;
}

第二种:用int类型的二维数组存放,输入依然用字符形式,只是判断一下如果是数字就放入数组中。

#include<bits/stdc++.h>
using namespace std;
namespace p{
	int max;
}
int g[1500][1500];
char s[11000];
int dx[]={1,-1,0,0,-1,1,1,-1};
int dy[]={0,0,-1,1,1,-1,1,-1};
int n,m,t;
int step;
int dfs(int x,int y)
{
	int res=1;
	g[x][y]=0;
	for(int i=0;i<8;i++){
		if(x+dx[i]<0||x+dx[i]>=m||y+dy[i]<0||y+dy[i]>=n)continue;
		if(g[x+dx[i]][y+dy[i]]){
			res+=dfs(x+dx[i],y+dy[i]);
		}
	}
	return res;
}
int main()
{
	while(cin>>m>>n>>t){
		getchar();
		memset(g,0,sizeof(g));
		for(int i=0;i<m;i++){
			gets(s);
			int len=strlen(s);
			int k=0;
			for(int j=0;j<len;j++){
				if(isdigit(s[j]))g[i][k++]=s[j]-'0'; 
			}
		}
		p::max=-1;
		int res=0;	
		for(int i=0;i<m;i++){
			for(int j=0;j<n;j++){	
				if(g[i][j]){
					res++;
					int temp=dfs(i,j);
					p::max=max(p::max,temp);
				}
			}
		}
		cout<<res<<" "<<p::max*t<<endl;
	}
	return 0;
}

两种方法基本一致。

posted @ 2019-05-04 09:04  correct  阅读(192)  评论(0)    收藏  举报