最大岛屿
时间限制:1000 ms | 内存限制:65535 KB
难度:2
-
描述
-
神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等。加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠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
提示 - ①若一个陆地八个方向之一(上、下、左、右、左上、右上、左下、右下)的位置也是陆地,则视为同一个岛屿。
② 假设第一行,最后一行,第一列,最后一列全为0.
③ 1<M, N≤500 1<T≤100000
- 第1行:M N T,表示海域的长,宽及一个单位表示的面积大小
首先解决输入问题,因为题目中说了空格没用,所以空格是多余的,方法1:可以用sscanf去空格输入,方法2
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
scanf(" %c",&cmap[i][j]);
if(cmap[i][j]==' ')
j--;
}
就是如果当前输入的字符是空格,那么我们就让j减去1,让下标不改变。
这样就能保证最终二维数组中没有空格,只有01表示海洋和小岛。然后我们用深搜,每次深搜我们都对它进行计数,然后让最大值和当前搜索所得的小岛面积比较,不断更新最大面积值,最终输出答案即可
题目代码:
#include<stdio.h>
#include<string.h>
char cmap[501][501]; //定义一个大一点的二维数组
int dir[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
//搜索的八个方向
int num=0; //用来计数岛的大小
void dfs(int x,int y) //深搜
{
if(cmap[x][y]=='0') //如果当前的位置是海洋,就返回,搜索下一个位置
return;
num++; //说明当前位置是岛,数量增加1
cmap[x][y]='0'; //这个位置已经到过了,将这个位置标记为海洋
for(int i=0;i<8;i++) //进行八个方向的搜索
{
int dx=x+dir[i][0];
int dy=y+dir[i][1];
dfs(dx,dy);
}
}
int main()
{
int M,N,T,i,j,ccount,mmax;
while(~scanf("%d%d%d",&M,&N,&T)) //海域的长,宽,单位面积
{
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
scanf(" %c",&cmap[i][j]);
if(cmap[i][j]==' ') //用于去除输入中的空格
j=j-1;
}
ccount=0; //岛的个数初始化为0
mmax=0; //最大岛屿的面积也初始化为0
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
if(cmap[i][j]=='1') //这个位置是岛,就从这个位置进行搜索
{
num=0; //岛的大小赋为0
ccount++; //岛的个数增加1
dfs(i,j); //从当前位置开始搜索,寻找和它相邻的所有土地
if(mmax<num)
mmax=num; //如果面积最大值小于这个岛的面积,更新最大值
}
}
printf("%d %d\n",ccount,mmax*T); //输出岛的数目和最大岛屿的面积
}
return 0;
}