zoukankan      html  css  js  c++  java
  • 最大岛屿

                                                       最大岛屿

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 34  解决: 17
    [提交][状态][讨论版]

    题目描述

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

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

    约束条件

         ①若一个陆地八个方向之一(上、下、左、右、左上、右上、左下、右下)的位置也是陆地,则视为同一个岛屿。

    ② 假设第一行,最后一行,第一列,最后一列全为0.

    ③ 1<M, N500   1<T100000

    输入


    第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
    输入用%1d存入数组,dfs找出岛屿数目,记录岛屿面积,更新岛屿面积最大值,输出时注意答案可能超过int范围。

    #include<stdio.h>
    void dfs(int x,int y);
    int m,n,max;
    int ans=0;
    long long q;
    int a[510][510];
    int main()
    {
        int i,j,sum,t;
        while(scanf("%d%d",&m,&n)!=EOF)
        {
            max=0;
            scanf("%d",&t);
            sum=0;
            for(i=0;i<m;i++)
                for(j=0;j<n;j++)
                    scanf("%1d",&a[i][j]);
            for(i=0;i<m;i++)
            {
                for(j=0;j<n;j++)
                    if(a[i][j]==1)
                    {
                        ans=0;
                        dfs(i,j);
                         
                        sum++;
                    }   
            }
            q=(long long)t*max;
            printf("%d %lld
    ",sum,q);  
        }
        return 0;
    }
    void dfs(int x,int y)
    {
        ans++;
        int tx,ty,i,j,k;
        int next[8][2]={1,0, 0,1, -1,0, 0,-1, 1,1, -1,-1, 1,-1, -1,1};
        a[x][y]=0;
        for(k=0;k<8;k++)
        {
            tx=x+next[k][0];
            ty=y+next[k][1];
            if(tx<0||tx>m-1||ty<0||ty>n-1)
                continue;
            if(a[tx][ty]==1)
                dfs(tx,ty);
        }
        if(ans>max)
            max=ans;
        return;
    }

  • 相关阅读:
    一个有趣的C语言问题
    PHP 管理树莓派
    JeeSite | 保存信息修改记录封装
    SQL Server学习内容(一)
    Java面试题大汇总
    Spring框架快速入门
    单例模式
    简要分析一下java中线程的生命周期
    mybatis中的高级查询
    mybatis中的分页插件
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/10003047.html
Copyright © 2011-2022 走看看