内心OS:这道题是去年准备HD复试时,我用来练习DFS的。现在再做这道题,感触颇深,唉,时光蹉跎,物是人非啊~~

题目:

你有一张某海域NxN像素的照片,”.”表示海洋、”#”表示陆地,如下所示:

……. 
.##…. 
.##…. 
….##. 
..####. 
…###. 
……. 

其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:

……. 
……. 
……. 
……. 
….#.. 
……. 
……. 

请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
【输入格式】
第一行包含一个整数N。 (1 <= N <= 1000)
以下N行N列代表一张海域照片。
照片保证第1行、第1列、第N行、第N列的像素都是海洋。
【输出格式】
一个整数表示答案。
【输入样例】

7
.......
.##....
.##....
....##.
..####.
...###.
.......

【输出样例】

1

【输入样例】

7
##...##
#..####
#...###
##.....
#......
.......
.......

【输出样例】

0

思路分析:

题意不难理解,即海平面上升前,求出岛屿个数 cnt_before,海平面上升以后,求出岛屿个数 cnt_after,计算两者之差,即被淹没的岛屿个数。

//1.求出海平面上升前的岛屿个数 cnt_before

//2.海平面上升以后,岛屿发生改变,得到一个新的海域 。

//3.求出海平面上升后的岛屿个数 cnt_after

//4.得到被淹没的岛屿个数(注意,一个岛屿的部分陆地被淹没后,可能会成为两个岛屿,导致海平面上升以后,岛屿的个数变多)

 #include<iostream>
using namespace std; const int maxn = ;
char area[maxn][maxn]; //原始海域
char area_temp[maxn][maxn]; //备份 原始海域
int n,cnt_before = ,cnt_after = ; void DFS_cnt(int i, int j) { //统计岛屿个数
if(i < || j < || i>= n || j >= n || area[i][j] == '.' || area[i][j] == ',')//不能逾越海域边界,或碰到大海,或者被淹没的陆地,就返回---递归边界
return ;
area[i][j] = '.';
DFS_cnt(i,j+);//四个方向作为选择分支
DFS_cnt(i,j-);
DFS_cnt(i+,j);
DFS_cnt(i-,j);
} int main() {
cin>>n;
for(int i = ; i < n; ++i) {//初始化 海域
for(int j = ; j < n; ++j) {
cin>>area[i][j];
area_temp[i][j] = area[i][j]; //备份 海域
}
}
//求出海平面上升以前的岛屿个数 cnt_before
for(int i = ; i < n; ++i) {
for(int j = ; j < n ; ++j) {
if(area[i][j] == '#') {
DFS_cnt(i,j);
cnt_before++;
}
}
}
//海平面上升以后,岛屿发生改变,得到一个新的海域
for(int i = ; i < n; ++i) {
for(int j = ; j < n ; ++j) {
if(area_temp[i][j] == '#'&&(area_temp[i+][j]=='.'||area_temp[i-][j]=='.'||area_temp[i][j+]=='.'||area_temp[i][j-]=='.')) {
area_temp[i][j] = ','; //陆地被淹没了
}
area[i][j] = area_temp[i][j];
}
}
//求出海平面上升以后的岛屿个数 cnt_before
for(int i = ; i < n; ++i) {
for(int j = ; j < n ; ++j) {
if(area[i][j] == '#') {
DFS_cnt(i,j);
cnt_after++;
}
}
}
cout<<(cnt_before > cnt_after?cnt_before - cnt_after : );//被淹没的岛屿个数。
return ;
}

运行结果 1:

运行结果 2:

深度优先搜索DFS---全球变暖的更多相关文章

  1. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

  2. 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)

    需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...

  3. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

  4. 【算法入门】深度优先搜索(DFS)

    深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解 ...

  5. 深度优先搜索 DFS 学习笔记

    深度优先搜索 学习笔记 引入 深度优先搜索 DFS 是图论中最基础,最重要的算法之一.DFS 是一种盲目搜寻法,也就是在每个点 \(u\) 上,任选一条边 DFS,直到回溯到 \(u\) 时才选择别的 ...

  6. 深度优先搜索(DFS)

    [算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...

  7. 算法总结—深度优先搜索DFS

    深度优先搜索(DFS) 往往利用递归函数实现(隐式地使用栈). 深度优先从最开始的状态出发,遍历所有可以到达的状态.由此可以对所有的状态进行操作,或列举出所有的状态. 1.poj2386 Lake C ...

  8. HDU(搜索专题) 1000 N皇后问题(深度优先搜索DFS)解题报告

    前几天一直在忙一些事情,所以一直没来得及开始这个搜索专题的训练,今天做了下这个专题的第一题,皇后问题在我没有开始接受Axie的算法低强度训练前,就早有耳闻了,但一直不知道是什么类型的题目,今天一看,原 ...

  9. [LeetCode OJ] Word Search 深度优先搜索DFS

    Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...

  10. 广度优先(bfs)和深度优先搜索(dfs)的应用实例

    广度优先搜索应用举例:计算网络跳数 图结构在解决许多网络相关的问题时直到了重要的作用. 比如,用来确定在互联网中从一个结点到另一个结点(一个网络到其他网络的网关)的最佳路径.一种建模方法是采用无向图, ...

随机推荐

  1. 如何准备Java面试?如何把面试官的提问引导到自己准备好的范围内?

    Java能力和面试能力,这是两个方面的技能,可以这样说,如果不准备,一些大神或许也能通过面试,但能力和工资有可能被低估.再仔细分析下原因,面试中问的问题,虽然在职位介绍里已经给出了范围,但针对每个点, ...

  2. Codeforces_512_B

    http://codeforces.com/problemset/problem/512/B dp题,因为状态很多,所以用map保存,注意代码中的那个二层循环不能内外换,因为map会自动排序. #in ...

  3. ajax实现文本框的联想功能

    先写一个jsp通过ajax传值给servlet进行查询再传给对应的div进行显示. <%@ page language="java" contentType="te ...

  4. Wannafly挑战赛5 A珂朵莉与宇宙 前缀和+枚举平方数

    Wannafly挑战赛5 A珂朵莉与宇宙 前缀和+枚举平方数 题目描述 给你一个长为n的序列a,有n*(n+1)/2个子区间,问这些子区间里面和为完全平方数的子区间个数 输入描述: 第一行一个数n 第 ...

  5. 服务器安全之iptables

    服务器安全之iptables iptables防火墙简介 Netfilter/Iptables(以下简称Iptables)是unix/linux自带的一款优秀且开放源代码的安全自由的基于包过滤的防火墙 ...

  6. Solr系列2-Solr服务安装

    1: Solr简介 1.1 简介: 1.2 下载: 2:Solr 安装 2.1 安装 2.2 目录结构 3 :启动Solr 3.1 启动 3.2使用Solr提供的测试数据 3.5 Solr配置文集 3 ...

  7. C++泛化动态数组

    泛化动态数组 动态数组的核心思想是在存储数据时动态的管理数组元素占用的内存,通过调用动态数组的类方法来对数组中的数据进行增删改查操作.最初我们为数组申请10个元素的空间,放我们不断向数组中添加数据时, ...

  8. C++ substr 截取子串

    1. substr() 方法使用 string substr (size_t pos = 0, size_t len = npos) const;pos: 截取初始位置(从头开始截取pos=0)len ...

  9. C#设计模式学习笔记:(15)迭代器模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7903617.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第三个模式--迭 ...

  10. 代理模式-jdk动态代理

    IDB package com.bjpowernode.proxy; /** * 代理类和目标类都必须使用同一个接口. */ public interface IDB { int insert(); ...