NYOJ:最大岛屿

本文介绍了一个关于岛屿数量和最大岛屿面积的计算问题。通过深度优先搜索算法遍历地图,实现对岛屿数量及其最大面积的有效计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最大岛屿

时间限制: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:可以用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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值