当前位置: 首页 > news >正文

全球变暖

题目描述

你有一张某海域 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);
         }
     }
 }
}

相关文章:

  • 答疑解惑:EMC VMAX3 MMCS控制台不定期重启原因分析
  • 浙大:DeepSeek技术溯源及前沿探索
  • 在SpringBoot中整合Mybatis框架
  • 实现极限网关(INFINI Gateway)配置动态加载
  • H2S Probe硫化氢荧光探针它可以通过荧光来检测H2S水平
  • Vue如何利用Postman和Axios制作小米商城购物车----简版
  • 在MFC中使用Qt(二):实现Qt文件的自动编译流程
  • 虚拟机Vmware无法连接网络
  • FFmpeg开发学习:AVFormatContext结构体
  • 【大模型基础_毛玉仁】3.4 Prompt 技巧
  • 深度学习四大核心架构:神经网络(NN)、卷积神经网络(CNN)、循环神经网络(RNN)与Transformer全概述
  • C++的IO流
  • hackmyvm-jan
  • 如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载?
  • Linux进程间的通信
  • 如何将3DMax模型转换到Blender?
  • 51单片机
  • 基于代理(http\https\socks)的网络访问逻辑重定义
  • 基于本人的专利设计三角形式的三组定子和中间的分形转子结构
  • 海外营收占比近4成,泡泡玛特全球化战略迎收获期
  • 广东缉捕1名象牙走私潜逃非洲“红通”逃犯
  • 湖南4个县市区被确定为野生蘑菇中毒高风险区:中毒尚无特效解毒药
  • 竞彩湃|欧联杯决赛前,曼联、热刺继续划水?
  • 武大校长:人工智能不存在“过度使用”,武大不会缩减文科
  • 国产水陆两栖大飞机AG600批产首架机完成总装下线
  • 浙江公开征集涉企行政执法问题线索,包括乱收费、乱罚款等