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;
}
两种方法基本一致。
本文来自博客园,作者:correct,转载请注明原文链接:https://www.cnblogs.com/correct/p/12862117.html

浙公网安备 33010602011771号