标题:全球变暖
你有一张某海域NxN像素的照片,"."表示海洋、"#"表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
【输入格式】
第一行包含一个整数N。 (1 <= N <= 1000)
【输入样例】
7
.......
.##....
.##....
....##.
..####.
...###.
.......
【输出样例】
你有一张某海域NxN像素的照片,"."表示海洋、"#"表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
【输入格式】
第一行包含一个整数N。 (1 <= N <= 1000)
以下N行N列代表一张海域照片。
照片保证第1行、第1列、第N行、第N列的像素都是海洋。
【输出格式】
一个整数表示答案。【输入样例】
7
.......
.##....
.##....
....##.
..####.
...###.
.......
【输出样例】
1
思路:一个dfs判断。
#include<cstdio>
#include<cstring>
using namespace std;
int n, len = 0, cnt = 0;
int vis[1005][1005], ans[1005];
char arr[1005][1005];
void dfs(int a, int b, int k){
if(arr[a][b] == '.')return;
if(vis[a][b])return;
if(arr[a+1][b] == '#' && arr[a-1][b] == '#' && arr[a][b+1] == '#' && arr[a][b-1] == '#') ans[k]++;
vis[a][b] = 1;
dfs(a + 1, b, k);
dfs(a - 1, b, k);
dfs(a, b + 1, k);
dfs(a, b - 1, k);
}
int main(){
scanf("%d", &n);
memset(vis, 0, sizeof(vis));
getchar(); //读掉第一行的换行符
for(int i = 0; i < n; i++){
gets(arr[i]);
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(arr[i][j] == '#' && !vis[i][j]){
dfs(i, j, len);
len++;
}
}
}
for(int i = 0; i < len; i++){
if(ans[i] == 0) cnt++;
}
printf("%d", cnt);
return 0;
}