千岛湖问题
这是一道C/C++上机题。用递归解决。
千岛湖,位于中国浙江省杭州西郊淳安县境内,东距杭州 129 千米、西距黄山 140 千米,是长江三角洲地区的后花园,是世界上岛屿最多的湖,因湖内拥有 1078 座翠岛而得名。
现在小红手里有一张 n×n 的千岛湖地图,地图上「*」表示陆地,「.」表示水域,两块陆地相连当且仅当一块陆地在另一块陆地的东南西北(上下左右)四个方向的相邻格子上。小红想知道地图上有几个岛屿,可是地图实在太大了,人难以完成这个任务,于是他请来了会编程的你来帮她解决这个问题。
Input Description
一张 n×n 的地图 (1<=n<=1000)
Output Description
一个数字,表示岛屿个数。
Samples
INPUT 1
**.*.
..*..
**...
.*...
**...
OUTPUT 1
4
INPUT 2
*.*.......
...*....*.
......*..*
**........
...*..*...
...*.....*
...**..*.*
**..*..*.*
..*...*...
*.*...*.*.
OUTPUT 2
16
C++如下(头文件如此古怪是因为学校OJ的feature,要不然过不了)
#include <iostream>
#include <string.h>
using namespace std;
typedef struct Map {
int size;
char m[1001][1001];
int legal[1001][1001];
} map;
map initMap() {
map M = {0};
scanf("%s", M.m[0]);
M.size = strlen(M.m[0]);
for (int i = 1; i < M.size; i++) {
scanf("%s", M.m[i]);
}
return M;
}
void check(map *M, int i, int j, int count) {
M->legal[i][j] = count;
if (M->legal[i - 1][j] == 0 && M->m[i - 1][j] == '*') {
check(M, i - 1, j, count);
}
if (M->legal[i][j - 1] == 0 && M->m[i][j - 1] == '*') {
check(M, i, j - 1, count);
}
if (M->legal[i][j + 1] == 0 && M->m[i][j + 1] == '*') {
check(M, i, j + 1, count);
}
if (M->legal[i + 1][j] == 0 && M->m[i + 1][j] == '*') {
check(M, i + 1, j, count);
}
}
int main() {
map MAP = initMap();
int count = 0;
for (int i = 0; i < MAP.size; i++) {
for (int j = 0; j < MAP.size; j++) {
if (MAP.m[i][j] == '.') { //是水
MAP.legal[i][j] = 0;
} else {
if (MAP.legal[i][j] == 0)
count++;
check(&MAP, i, j, count);
}
}
}
cout<<count;
return 0;
}