全球变暖
题目描述
你有一张某海域 NxNNxN 像素的照片,"."表示海洋、"#"表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
输入描述
第一行包含一个整数 N (1≤N≤1000)N (1≤N≤1000)。
以下 NN 行 NN 列代表一张海域照片。
照片保证第 1 行、第 1 列、第 NN 行、第 NN 列的像素都是海洋。、
输出一个整数表示答案。
输入输出样例
示例
输入
7
.......
.##....
.##....
....##.
..####.
...###.
.......
输出
1
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
总通过次数: 12235 | 总提交次数: 14821 | 通过率: 82.6%
难度: 困难 标签: 2018, 省赛, DFS
package com.cjh.lanqiao;
import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改
public class Main74 {
static int[] xi = {-1,0,1,0}; //往上下左右四个方向寻找
static int[] yi = {0,1,0,-1};
static char[][] graph;//储存输入的地图
static int[][] visited;//表示位置是否访问过
static int N; //N * N像素地图
static int flag = 0; //标记是否是被完全淹没的岛屿
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt(); //获取输入
graph = new char[N][N]; //存储该地图
visited = new int[N][N]; //记录该地图某点是否被访问过
for (int i = 0; i < graph.length; i++) {
graph[i] = sc.next().toCharArray();
}
int count = 0; //记录淹没岛屿的数量
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (visited[i][j] == 0 && graph[i][j] == '#') { //如果没有遍历过,且这块区域为陆地,就对其进行dfs遍历
flag = 0; //每次循环结束重置flag
dfs(graph, i, j);
if (flag == 0) { //如果是岛屿,但是不能存在四个方向的“#“则未来会被淹没
count++; //淹没的岛屿数量加一
}
}
}
}
System.out.println(count);
}
//深度优先遍历
static void dfs(char[][] graph, int x, int y) {
visited[x][y] = 1; //标记已遍历过
//因为有"#"的地方周围外圈都是海洋,所以不用担心下标越界问题
if (graph[x][y + 1] == '#' && graph[x][y - 1] == '#'
&& graph[x + 1][y] == '#' && graph[x - 1][y] == '#') {
flag = 1; //如果四个方向都是‘#’则表明是不被完全淹没的岛屿,flag置为1
}
for (int i = 0; i < 4; i++) {
//向四个方位移动,如果存在"#"(陆地)则继续递归寻找是否存在不被完全淹没的岛屿
int xx = x + xi[i], yy = y + yi[i];
if (visited[xx][yy] == 0 && graph[xx][yy] == '#') {
dfs(graph, xx, yy);
}
}
}
}