深度优先搜索DFS---全球变暖

Posted keep23456

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度优先搜索DFS---全球变暖相关的知识,希望对你有一定的参考价值。

内心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.得到被淹没的岛屿个数(注意,一个岛屿的部分陆地被淹没后,可能会成为两个岛屿,导致海平面上升以后,岛屿的个数变多)

 1 #include<iostream>
 2 using namespace std;
 3 
 4 const int maxn = 1010;
 5 char area[maxn][maxn]; //原始海域
 6 char area_temp[maxn][maxn]; //备份 原始海域
 7 int n,cnt_before = 0,cnt_after = 0;
 8 
 9 void DFS_cnt(int i, int j) { //统计岛屿个数 
10     if(i < 0 || j < 0 || i>= n || j >= n || area[i][j] == . || area[i][j] == ,)//不能逾越海域边界,或碰到大海,或者被淹没的陆地,就返回---递归边界
11         return ;
12     area[i][j] = .;
13     DFS_cnt(i,j+1);//四个方向作为选择分支
14     DFS_cnt(i,j-1);
15     DFS_cnt(i+1,j);
16     DFS_cnt(i-1,j);
17 }
18 
19 
20 int main() {
21     cin>>n;
22     for(int i = 0; i < n; ++i) {//初始化 海域
23         for(int j = 0; j < n; ++j) {
24             cin>>area[i][j];
25             area_temp[i][j] = area[i][j]; //备份 海域 
26         }
27     }
28     //求出海平面上升以前的岛屿个数 cnt_before
29     for(int i = 0; i < n; ++i) {
30         for(int j = 0; j < n ; ++j) {
31             if(area[i][j] == #) {
32                 DFS_cnt(i,j);
33                 cnt_before++;
34             }
35         }
36     }
37     //海平面上升以后,岛屿发生改变,得到一个新的海域
38     for(int i = 0; i < n; ++i) {
39         for(int j = 0; j < n ; ++j) {
40             if(area_temp[i][j] == #&&(area_temp[i+1][j]==.||area_temp[i-1][j]==.||area_temp[i][j+1]==.||area_temp[i][j-1]==.)) {
41                 area_temp[i][j] = ,; //陆地被淹没了
42             }
43             area[i][j] = area_temp[i][j];  
44         }
45     }
46     //求出海平面上升以后的岛屿个数 cnt_before
47     for(int i = 0; i < n; ++i) {
48         for(int j = 0; j < n ; ++j) {
49             if(area[i][j] == #) {
50                 DFS_cnt(i,j);
51                 cnt_after++;
52             }
53         }
54     }
55     cout<<(cnt_before > cnt_after?cnt_before - cnt_after : 0);//被淹没的岛屿个数。
56     return 0;
57 }

运行结果 1:

技术图片

运行结果 2:

技术图片

 

以上是关于深度优先搜索DFS---全球变暖的主要内容,如果未能解决你的问题,请参考以下文章

深度优先搜索DFS

深度优先搜索(DFS: Depth First Search)

数据结构与算法图遍历算法 ( 深度优先搜索 DFS | 深度优先搜索和广度优先搜索 | 深度优先搜索基本思想 | 深度优先搜索算法步骤 | 深度优先搜索理论示例 )

深度优先搜索 DFS(Depath First Search, DFS)

LeetCode 988:回溯和深度优先搜索(DFS)的区别

DFS(深度优先搜索)