如果你觉得这篇题解对你有用,可以点个赞或关注再走呗,谢谢你的关注~
题目描述
你有一张某海域 N×N
像素的照片,”.”表示海洋、”#”表示陆地,如下所示:
…
.##…
.##…
…##.
…####.
…###.
…
其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿,例如上图就有 2
座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。
具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
…
…
…
…
…#…
…
…
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
输入格式
第一行包含一个整数N。
以下 N行 N 列,包含一个由字符”#”和”.”构成的 N×N字符矩阵,代表一张海域照片,”#”表示陆地,”.”表示海洋。
照片保证第 1行、第 1 列、第 N 行、第 N列的像素都是海洋。
输出格式
一个整数表示答案。
数据范围
1≤N≤1000
输入样例1:
7
…
.##…
.##…
…##.
…####.
…###.
…
输出样例1:
1
分析
其中”上下左右”四个方向上
#
连在一起的一片陆地组成一座岛屿。
具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋.
),它就会被淹没。
题目模拟(岛屿)
注:图中有3个岛屿,上下连续区域。
题目模拟(海洋淹没)
注:题中有一个岛屿全被淹没
题目解读
观察一下:岛屿中陆地的数量和海洋的数量是统一的。
如果这个陆地上下左右方向只要有一个方向有.
的话,就说明该陆地会被淹没。
也就是只要我们在陆地上下左右方向中找到了一个.
,就说明这个陆地被淹没。
换言之,如果说岛屿中陆地被淹没了,就存在至少一个方向的海洋.
。
我们只需要统计岛屿的个数和海洋的个数即可。
如果海洋个数和岛屿中陆地的个数相等,则说明该岛屿已被淹没。否则未被淹没。
所以,关键在于维护海洋和岛屿中陆地的个数。
这题用BFS来处理
首先没有点与点之间的关系,所以我们不用邻接表来存储边和点的关系。
而是用队列的方式去维护BFS一层一层往外搜,一层一层往外扩。
那在bfs中我们还需要维护其他变量用于解决此题。
首先,我们需要去统计连通块(岛屿)中陆地的个数 res。
这里在队头元素出队的时候,统计一下即可。
设定isbound来标记是边界的.
然后,弹出队头,进行上下左右的坐标移动,统计其上下左右方向是否有.
。
有的话,我们就将该位置的坐标标记上false。
最后统计一下每个岛屿的isbound的个数有多少个。
如果说res和isbound相等,则说明该岛屿全部淹没。
代码
import java.util.*;
public class Main{static int N=1010;static char g[][]=new char[N][N];static boolean st[][]=new boolean [N][N];static int dx[]= {1,0,-1,0};static int dy[]= {0,-1,0,1};static int n;static int cnt;public static void main(String []args) {Scanner in=new Scanner(System.in);n=in.nextInt();for(int i=0;i<n;i++) {char a[]=in.next().toCharArray();for(int j=0;j<n;j++) {g[i][j]=a[j];} }for(int i=0;i<n;i++) {for(int j=0;j<n;j++) {if(g[i][j]=='#'&&!st[i][j]) {if(bfs(i,j))cnt++; }}}System.out.println(cnt); }public static boolean bfs(int x,int y) {Queue<pair>q=new LinkedList<>();q.add(new pair(x,y));int res=0;int bound=0;st[x][y]=true;while(!q.isEmpty()) {pair t=q.poll();res++;boolean isbound=false;for(int i=0;i<4;i++) {int a=t.x+dx[i];int b=t.y+dy[i];if(a<0||a>=n||b<0||b>=n)continue;if(st[a][b])continue;if(g[a][b]=='.') {isbound=true;continue;}q.add(new pair(a, b));st[a][b]=true;}if(isbound)bound++; }return res==bound;}
}
class pair{int x;int y;public pair(int x,int y) {this.x=x;this.y=y;}
}