最大島嶼問題
最大島嶼
時間限制: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;
}