第九届蓝桥杯之全球变暖

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


.......
.##....
.##....
....##.
..####.
...###.
.......


其中“上下左右”四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。  


由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。  


例如上图中的海域未来会变成如下样子:


.......
.......
.......
.......
....#..
.......
.......


请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。  


【输入格式】
第一行包含一个整数N.(1 <= N <= 1000)  
以下N行N列代表一张海域照片。  


照片保证第1行,第1列,第N行,第N列的像素都是海洋。  


【输出格式】
一个整数表示答案。


【输入样例】

.......
.##....
.##....
....##.
..####.
...###.
.......  


【输出样例】
1  

 

 

 

 1 #include <iostream>
 2 using namespace std;
 3 char a[1001][1001];//记录地图 
 4 int book[1001][1001];//记录是否被走过 
 5 int n;
 6 bool flag;
 7 bool check(int x, int y){//检查该点是不是沿海土块 
 8     //如果该点上下左右都是#说明这个点不是沿海土块 
 9     if(a[x][y] == '#' && a[x - 1][y] == '#' && a[x + 1][y] == '#' 
10     && a[x][y - 1] == '#' && a[x][y + 1] == '#'){
11         return true;
12     }
13     return false;//如果是沿海土块返回假 
14 }
15 void dfs(int x, int y){
16     int next[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};//四个方向 
17     int tx, ty; 
18     for(int k = 0; k < 4; k++){
19         tx = x + next[k][0];
20         ty = y + next[k][1];
21         if(tx < 0 || tx >= n || ty < 0 || ty >= n ){//走出地图 
22             continue;
23         }
24         if(a[tx][ty] == '#' && book[tx][ty] == 0){
25             book[tx][ty] = 1;//这里标记不用回溯 
26             if(check(tx, ty)){
27                 flag = true;//只要该点不是沿海土块(言外之意是只要有一个土块没被淹没
28                 //该岛就不会消失) 
29             }
30             dfs(tx, ty);
31         }
32     }
33 }
34 int main(){
35     int cur = 0;//被淹没岛的起始数; 
36     cin >> n;
37     for(int i = 0; i < n; i++){
38         for(int j = 0; j < n; j++){
39             cin >> a[i][j];
40         }
41     }
42     for(int i = 0; i < n; i++){
43         for(int j = 0; j < n; j++){
44             if(a[i][j] == '#' && book[i][j] == 0){
45                 flag = false;//每次涂色之前重置flag 
46                 book[i][j] = 1;//将出发点标记 
47                 dfs(i,j);//判断该岛是否会被淹没 
48                 if(!flag) cur++;//如果会被淹没就+1 
49             } 
50             
51         }
52     }
53     cout << cur;
54     return 0;
55 } 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值