目录
题目描述
输入描述
输入输出样例:
题目分析:(DFS)
AC代码(Java):
题目描述
你有一张某海域 NxN像素的照片,"."表示海洋、"#"表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
输入描述
第一行包含一个整数 N(1≤N≤1000)。
以下 N 行 N 列代表一张海域照片。
照片保证第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋。
输出一个整数表示答案。
输入输出样例:
输入
7
.......
.##....
.##....
....##.
..####.
...###.
.......
输出
1
题目分析:(DFS)
输入
输出
蓝桥杯(阅读理解杯),首先要看明白题目的要求
1.给的是一个图,“.”表示海水,"#"表示陆地,根据题目要求,其实只有两种情况,海水和陆地,那么可以考虑用boolean来存放,false为海水,true为陆地
2.什么是岛屿?一块陆地也可以算一座岛屿,只要它四周都是海水,相连的陆地,周围是海水,那么也只算一块岛屿,明白了这个,再继续往下看
3.如果一个陆地 上下左右 都是陆地,那么它就肯定不会被淹没。按照这个来看,我们可以把这块陆地叫做 “山”。因为不是山的陆地,周围肯定有海水,按照题目来说,就是肯定会被淹没。
4.有一种情况(error了两次,就是因为没考虑这个),也就是一块岛屿,被淹没之后,有可能变成了两块岛屿,所以先求所有的岛屿数量,在将这些岛屿进行淹没处理,在计算剩余岛屿数量是行不通的。既然这样,那我们可以换一个思路,我们先拿到图,复制一份,将图中为山的坐标记为true,其余都是海水,然后原始的那张图就正常记录(false是海水,true是陆地),然后遇到陆地,就dfs搜索该块陆地(row,col),如果这块陆地没有和山相连,那么这块岛屿(因为要搜索与这块陆地相连的部分,也可以将这块陆地叫做岛屿,当然,如果这块陆地周围都是水,那么也可以叫做岛屿)中没有山,那么这块岛屿肯定会被沉没,那么我们就返回true,然后记录淹没数量。
5.具体代码每一步我都写有注释,如果不明白可以讨论区提问,我看到就会回~
AC代码(Java):
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
//创建两个boolean数组,用来存放海域状态(因为海域就只可能有两种状态,海水和陆地),节省空间
static boolean[][] target,result;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
//target存放海域初始状态
target = new boolean[N][N];
for(int row = 0;row



