最大島嶼

題目描述:神祕的海洋,驚險的探險之路,打撈海底寶藏,激烈的海戰,海盜劫富等等。加勒比海盜,你知道吧?傑克船長駕駛着本身的的戰船黑珍珠1號要征服各個海島的海盜,最後成爲海盜王。  這是一個由海洋、島嶼和海盜組成的危險世界。面對危險重重的海洋與詭譎的對手,如何憑藉智慧與運氣,創建起一個強大的海盜帝國。app

傑克船長手頭有一張整個海域的海圖,上面密密麻麻分佈着各個海嶼的位置及面積。他想盡快知道整個海域共有多少島嶼以及最大島嶼的面積。函數

 

輸入

第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

提示
   ①若一個陸地八個方向之一(上、下、左、右、左上、右上、左下、右下)的位置也是陸地,則視爲同一個島嶼。
   ② 假設第一行,最後一行,第一列,最後一列全爲0.
   ③ 1<M,   N≤500      1<T≤100000。

樣例輸出

5 990
此題是屬於搜索的題難度通常。重在思想。
下面是我的對此題的見解:
 這道題和水池數目的題差很少。首先是輸入的時候有個別容易忽略的地方,scanf函數的輸入在最後最好用getchar()函數進行處理一下。爲的是處理回車鍵。而後是對空格的處理,因爲scanf函數能夠接收
空格,因此在用scanf函數的時候應該對空格進行消去。而後是調用函數中的8方向處理同時須要對每一個島嶼中的單位島嶼進行計數。
下面附上代碼:



 

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 #include <math.h>
 5 
 6 char a[501][501];
 7 int N,M,T,num1;
 8 void ty(int y,int x)
 9 {
10     num1++;
11     a[y][x]='0';
12     int str[8][2]={0,-1,0,1,-1,0,1,0,-1,-1,-1,1,1,1,1,-1};
13         for(int k=0;k<8;k++)
14         {
15             int zx=x+str[k][1],zy=y+str[k][0];
16             if(zx>=0&&zx<N&&zy>=0&&zy<M&&a[zy][zx]=='1')
17                 {
18                     ty(zy,zx);
19                 }
20         }
21 }
22 int main ()
23 {
24     int i,j,num=0,sum[500],t=0;
25     char q;
26     scanf("%d%d%d",&M,&N,&T);
27     getchar();
28     for(i=0;i<M;i++)
29     {
30         for(j=0;j<N;j++)
31         {
32              scanf("%c",&q);
33              if(q==' ')
34                 j--;
35              else
36                 a[i][j]=q;
37         }
38         getchar();
39     }
40     for(i=0;i<M;i++)
41     {
42         for(j=0;j<N;j++)
43         {
44             if(a[i][j]=='1')
45             {
46                 num1=0;
47                 ty(i,j);
48                 num++;
49                 sum[t]=num1;
50                 t++;
51             }
52         }
53     }
54     for(i=0;i<t;i++)
55     {
56         if(sum[i]>sum[0])
57             sum[0]=sum[i];
58     }
59     printf("%d %d\n",num,sum[0]*T);
60     return 0;
61 }
相關文章
相關標籤/搜索