博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
蓝桥杯 全球变暖(dfs)
阅读量:7023 次
发布时间:2019-06-28

本文共 2758 字,大约阅读时间需要 9 分钟。

标题:全球变暖

【题目描述】
你有一张某海域NxN像素的照片,"."表示海洋、"#"表示陆地,如下所示:

 

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

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

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

 

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

【输入格式】

第一行包含一个整数N。 (1 <= N <= 1000)
以下N行N列代表一张海域照片。

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

【输出格式】

一个整数表示答案。

【样例输入】

7

 

【样例输出】

1

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

注意:

main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

 

思路: 使用dfs分别计算出原始岛屿数和后来剩余的岛屿数即可。 

 

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 10 using namespace std; 11 12 char mp[1010][1010]; 13 int grid[1010][1010]; // 用于涂色判断 14 int flag[1010][1010]; // mp[i][j]四周都不与海相邻,则flag[i][j] = 1 15 16 int N; 17 int dx[4] = { 1,-1,0,0 }; 18 int dy[4] = { 0,0,1,-1 }; 19 20 int color; // 第一块岛屿范围内涂1,第二块岛屿范围内涂2,以此类推 21 22 void dfs(int x, int y) 23 { 24 if (x < 0 || x >= N || y < 0 || y >= N) 25 return; 26 27 for (int i = 0; i < 4; ++i) 28 { 29 int xx = x + dx[i]; 30 int yy = y + dy[i]; 31 32 if (mp[xx][yy] == '#' && grid[xx][yy] == 0) 33 { 34 grid[xx][yy] = color; 35 dfs(xx, yy); 36 } 37 } 38 39 40 } 41 42 bool isNotAdjacent(int x, int y) // 该块陆地四周都不与海相邻,返回true 43 { 44 for (int i = 0; i < 4; ++i) 45 { 46 int xx = x + dx[i]; 47 int yy = y + dy[i]; 48 49 if (x >= 0 && x < N && y >= 0 && y < N && mp[xx][yy] == '.') 50 return false; 51 } 52 53 return true; 54 55 } 56 57 58 int main() 59 { 60 cin >> N; 61 for (int i = 0; i < N; ++i) 62 for (int j = 0; j < N; ++j) 63 { 64 cin >> mp[i][j]; 65 } 66 67 68 memset(grid, 0, sizeof(grid)); 69 color = 1; 70 // 使用dfs计算原始岛屿数 71 for (int i = 0; i < N; ++i) 72 for (int j = 0; j < N; ++j) 73 { 74 if (mp[i][j] == '#' && grid[i][j] == 0) // grid[i][j]等于0说明mp[i][j]还未被涂过色 75 { 76 dfs(i, j); 77 color++; 78 } 79 } 80 81 int start_num = color - 1; 82 83 memset(flag, 0, sizeof(flag)); 84 for (int i = 0; i < N; ++i) 85 for (int j = 0; j < N; ++j) 86 { 87 if (isNotAdjacent(i, j)) 88 { 89 flag[i][j] = 1; 90 } 91 } 92 93 94 for (int i = 0; i < N; ++i) 95 for (int j = 0; j < N; ++j) 96 { 97 if (flag[i][j] != 1) // 将所有被淹没的陆地置为 '.' 98 { 99 mp[i][j] = '.';100 }101 }102 103 104 105 memset(grid, 0, sizeof(grid));106 color = 1;107 // 再次使用dfs计算后来剩下的岛屿数108 for (int i = 0; i < N; ++i)109 for (int j = 0; j < N; ++j)110 {111 if (mp[i][j] == '#' && grid[i][j] == 0)112 {113 dfs(i, j);114 color++;115 }116 }117 118 int end_num = color - 1;119 120 cout << start_num - end_num << endl;121 122 return 0;123 }

 

转载于:https://www.cnblogs.com/FengZeng666/p/10542064.html

你可能感兴趣的文章
我的友情链接
查看>>
MySQL中优化sql语句查询常用的30种方法
查看>>
C#实现RSA加密解密
查看>>
Linux系统上的任务计划相关命令at、crontab的使用方法
查看>>
内关联和外关联
查看>>
nginx + tomcat 架构中,error_page错误页面的设置
查看>>
文档的词频-反向文档频率(TF-IDF)计算
查看>>
mybatis-oracle批量插入数据的简单学习
查看>>
Linux 服务器免密登录
查看>>
安装exchange server 2010 sp2 遇到的问题
查看>>
设计模式笔记:单件模式(Singleton)
查看>>
Sql Server系列:事务完整性
查看>>
通过v$sqlarea和v$sql视图查找比较耗费资源的sql
查看>>
Windows下基于cwRsync的文件同步
查看>>
LVS简单介绍
查看>>
自动化清除分区与建立分区脚本
查看>>
我的友情链接
查看>>
VMWare tools的安装过程及文件共享设置
查看>>
以符合人类阅读的方式打印php数组
查看>>
单例模式
查看>>