建站哪家好 phpwind软文代写自助发稿平台
题目描述
你有一张某海域 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; //每次循环结束重置flagdfs(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);}}}
}