• 最大岛屿-----简单的 搜索


    最大岛屿

    时间限制: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 #include<stdio.h>
     2 #include<algorithm>
     3 #include<string.h>
     4 using namespace std;
     5 char a[505][505];
     6 __int64 T,S,maxn,M,N;
     7 void DFS(__int64 i,__int64 j)
     8 {
     9     if(i>=0&&i<=M&&j>=0&&j<=N&&a[i][j]=='1')
    10     {
    11         a[i][j]='0';
    12         S++;
    13     }
    14     else
    15         return ;
    16     DFS(i+1,j);
    17     DFS(i-1,j);
    18     DFS(i,j+1);
    19     DFS(i,j-1);
    20     DFS(i+1,j+1);
    21     DFS(i+1,j-1);
    22     DFS(i-1,j+1);
    23     DFS(i-1,j-1);
    24 }
    25 int main()
    26 {
    27     __int64 i,j,count;
    28     char q;
    29     while(scanf("%I64d%I64d%I64d",&M,&N,&T)!=EOF)
    30     {
    31         getchar();
    32         for(S=i=0;i<M;i++)
    33         {
    34             for(j=0;j<N;j++)
    35             {
    36                 scanf("%c",&q);
    37                 if(q==' ')
    38                     j--;
    39                 else
    40                     a[i][j]=q;
    41             }
    42             getchar();
    43         }
    44         for(count=i=0;i<M;i++)
    45             for(j=0;j<N;j++)
    46         {
    47             if(a[i][j]=='1')         //  如果是 陆地的话
    48             {
    49                 DFS(i,j);
    50                 count++;     //     一共有多少个 岛屿
    51                 maxn=max(maxn,S);       //  最大面积
    52                 S=0;
    53             }
    54         }
    55         printf("%I64d %I64d
    ",count,maxn*T);
    56     }
    57     return 0;
    58 }

     下面附上广搜代码

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<math.h>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<queue>
     7 #include<vector>
     8 #include<set>
     9 #include<stack>
    10 #include<string>
    11 #include<sstream>
    12 #include<map>
    13 #include<cctype>
    14 using namespace std;
    15 int n,m,s,b[8][2]={0,-1,0,1,-1,0,1,0,-1,-1,1,1,-1,1,1,-1},mian=0;
    16 char a[505][505];
    17 struct node
    18 {
    19     int x,y;
    20 };
    21 queue<node>Q;
    22 void BFS(int y,int x)
    23 {
    24     a[y][x]='0';
    25     mian++;
    26     node q={x,y};
    27     Q.push(q);
    28     while(!Q.empty())
    29     {
    30         node e=Q.front();
    31         Q.pop();
    32         for(int i=0;i<8;i++)
    33         {
    34             q.x=e.x+b[i][0];
    35             q.y=e.y+b[i][1];
    36             if(q.x>=0&&q.x<m&&q.y>=0&&q.y<n&&a[q.y][q.x]=='1')
    37             {
    38                 Q.push(q);
    39                 a[q.y][q.x]=0;
    40                 mian++;
    41             }
    42         }
    43     }
    44 }
    45 int main()
    46 {
    47     int count1=0,maxn=0;
    48     char c;
    49     while(scanf("%d%d%d",&n,&m,&s)!=EOF)
    50     {
    51         for(int i=0;i<n;i++)
    52             for(int j=0;j<m;j++)
    53             {
    54                 scanf("%c",&c);
    55                 if(c==' '||c=='
    ')
    56                     j--;
    57                 else
    58                     a[i][j]=c;
    59             }
    60         for(int i=0;i<n;i++)
    61             for(int j=0;j<m;j++)
    62         {
    63             if(a[i][j]=='1')
    64             {
    65                 BFS(i,j);
    66                 count1++;
    67                 maxn=maxn>mian?maxn:mian;
    68                 mian=0;
    69             }
    70         }
    71         printf("%d %d
    ",count1,maxn*s);
    72         maxn=count1=0;
    73     }
    74     return 0;
    75 }
  • 相关阅读:
    Android -- Camera2(Android5.0)
    Android -- Camera.ShutterCallback
    Android -- selector&&StateListDrawable
    Centos安装FTP服务器和配置
    Android -- setWillNotDraw()
    Android -- ViewPager切换动画,PageTransformer
    关于通信的关键词UDP/(TCP/IP)/IPC/RPC/.NET Remoting/WebService/WCF/Http 系列
    已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。
    JavaScript的NaN-唯一 一个自己不等于自己的对象!!
    【ShoppingPeeker】-基于Webkit内核的爬虫蜘蛛引擎 ShoppingWebCrawler的姊妹篇-可视化任务Web管理
  • 原文地址:https://www.cnblogs.com/A-FM/p/5250092.html
Copyright © 2020-2023  润新知