zoukankan      html  css  js  c++  java
  • 最大岛屿-----简单的 搜索

    最大岛屿

    时间限制: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 }
  • 相关阅读:
    request.getParameter() 、 request.getInputStream()和request.getReader() 使用体会
    HTTP之Content-Length
    关于spring3中No Session found for current thread!and Transaction的配置和管理(转)
    Java数据类型和MySql数据类型对应一览
    Spring MVC 解读——View,ViewResolver(转)
    LeetCode 441. Arranging Coins
    LeetCode 415. Add Strings
    LeetCode 400. Nth Digit
    LeetCode 367. Valid Perfect Square
    LeetCode 326. Power of Three
  • 原文地址:https://www.cnblogs.com/A-FM/p/5250092.html
Copyright © 2011-2022 走看看