1. 程式人生 > >最大島嶼問題

最大島嶼問題

                                                最大島嶼

                                                  時間限制: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


解題思路
    
    題目中說出空格可以忽略,所以可以不及空格的個數。例如:
    if (a == ' ') {
           j--;
    }
    這裡的 j-- 代表遇到空格時 j 返回上一數值.

解題程式碼

#include <bits/stdc++.h>
const int max_maxn = 1001;
using namespace std;

/*首先定義變數*/
char mm[max_maxn][max_maxn];/*存地圖*/
int aa[max_maxn][max_maxn];/*搜尋過的地圖*/
int i, j;
int x, y, area;/*長,寬,面積*/
int num;/*個數*/
int maxn;/*存的面積*/
int max_area;/*最大面積*/
void dfs(int x,int y) {
	
	if (mm[x][y] == '0' || aa[x][y] == 1) {
		return ;
	}
	maxn++;
	aa[x][y] = 1;
	/*8個方向分別進行搜尋*/
	dfs(x + 1, y);
	dfs(x - 1, y);
	dfs(x, y + 1);
	dfs(x, y - 1);
	dfs(x + 1, y + 1);
	dfs(x + 1, y - 1);
	dfs(x - 1, y + 1);
	dfs(x - 1, y - 1);
}
/*主函式*/
int main(void) {
	while (scanf_s("%d %d %d", &x, &y, &area) != EOF) {
		char a;
		num = max_area = 0;
		/*多組資料,每次執行前進行陣列重置*/
		memset(mm, 0, sizeof(mm));
		memset(aa, 0, sizeof(aa));

		for (i = 1; i <= x; i++) {
			for (j = 1; j <= y; j++) {
				cin >> a;
				if (a == ' ') {
					j--;
				}
				else {
					mm[i][j] = a;
				}
			}
		}
		for (i = 1; i <= x; i++) {
			for (j = 1; j <= y; j++) {
				if (mm[i][j] == '1' && aa[i][j] == 0) {
					maxn = 0;
					dfs(i, j);
					max_area = max(max_area, maxn);
					num++;
				}
			}
		}
		cout << num << " " << max_area * area<< endl;
	}
	cout << endl;
	system("pause");
	return 0;
}