你有一张某海域NxN像素的照片,”.”表示海洋、”#”表示陆地,如下所示:
…….
.##….
.##….
….##.
..####.
…###.
…….
其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
…….
…….
…….
…….
….#..
…….
…….
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
【输入格式】
第一行包含一个整数N。 (1 <= N <= 1000)
以下N行N列代表一张海域照片。
照片保证第1行、第1列、第N行、第N列的像素都是海洋。
【输出格式】
一个整数表示答案
比较害怕这种问题,所以没敢写。
困惑点:
1 如何判断有几个岛屿?想用dfs判断,做多遍dfs。这个思路是对的,其实我们用两个for循环搜索第一个未被访问过的#, 做dfs就好。
2 怎么把每个岛屿记录下来?之后判断岛屿是否会被全部淹没。但是其实这个过程我们可以在找岛屿的过程中就进行判断,判断在该岛屿中是否存在一个点#,它的四周都是#
#include<iostream> #include<cstdio> using namespace std; int mp[110][110]; int ans[11000]; bool vis[110][110]; void dfs(int x,int y,int k) { if(mp[x][y]=='.') return; if(vis[x][y]) return; vis[x][y]=1; if(mp[x-1][y]=='#'&&mp[x+1][y]=='#'&&mp[x][y-1]=='#'&&mp[x][y+1]=='#') ans[k]++; dfs(x+1,y,k); dfs(x-1,y,k); dfs(x,y-1,k); dfs(x,y+1,k); } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { getchar(); for(int j=1;j<=n;j++) scanf("%c",&mp[i][j]); } int len=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(mp[i][j]=='#'&&!vis[i][j]) { dfs(i,j,len); len++; } } } int sum=0; for(int i=0;i<len;i++) if(ans[i]==0) sum++; printf("%d\n",sum); }