蓝桥杯 全球变暖(dfs)
标题:全球变暖
【题目描述】
你有一张某海域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分别计算出原始岛屿数和后来剩余的岛屿数即可。
#include<iostream>
#include<string>
#include<queue>
#include<set>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stdio.h> using namespace std; char mp[][];
int grid[][]; // 用于涂色判断
int flag[][]; // mp[i][j]四周都不与海相邻,则flag[i][j] = 1 int N;
int dx[] = { ,-,, };
int dy[] = { ,,,- }; int color; // 第一块岛屿范围内涂1,第二块岛屿范围内涂2,以此类推 void dfs(int x, int y)
{
if (x < || x >= N || y < || y >= N)
return; for (int i = ; i < ; ++i)
{
int xx = x + dx[i];
int yy = y + dy[i]; if (mp[xx][yy] == '#' && grid[xx][yy] == )
{
grid[xx][yy] = color;
dfs(xx, yy);
}
} } bool isNotAdjacent(int x, int y) // 该块陆地四周都不与海相邻,返回true
{
for (int i = ; i < ; ++i)
{
int xx = x + dx[i];
int yy = y + dy[i]; if (x >= && x < N && y >= && y < N && mp[xx][yy] == '.')
return false;
} return true; } int main()
{
cin >> N;
for (int i = ; i < N; ++i)
for (int j = ; j < N; ++j)
{
cin >> mp[i][j];
} memset(grid, , sizeof(grid));
color = ;
// 使用dfs计算原始岛屿数
for (int i = ; i < N; ++i)
for (int j = ; j < N; ++j)
{
if (mp[i][j] == '#' && grid[i][j] == ) // grid[i][j]等于0说明mp[i][j]还未被涂过色
{
dfs(i, j);
color++;
}
} int start_num = color - ; memset(flag, , sizeof(flag));
for (int i = ; i < N; ++i)
for (int j = ; j < N; ++j)
{
if (isNotAdjacent(i, j))
{
flag[i][j] = ;
}
} for (int i = ; i < N; ++i)
for (int j = ; j < N; ++j)
{
if (flag[i][j] != ) // 将所有被淹没的陆地置为 '.'
{
mp[i][j] = '.';
}
} memset(grid, , sizeof(grid));
color = ;
// 再次使用dfs计算后来剩下的岛屿数
for (int i = ; i < N; ++i)
for (int j = ; j < N; ++j)
{
if (mp[i][j] == '#' && grid[i][j] == )
{
dfs(i, j);
color++;
}
} int end_num = color - ; cout << start_num - end_num << endl; return ;
}
蓝桥杯 全球变暖(dfs)的更多相关文章
- 蓝桥杯 带分数 DFS应用
问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...
- Java实现第九届蓝桥杯全球变暖
全球变暖 题目描述 你有一张某海域NxN像素的照片,"."表示海洋."#"表示陆地,如下所示: ....... .##.... .##.... ....##. ...
- 2018蓝桥杯 全球变暖(dfs)
你有一张某海域NxN像素的照片,"."表示海洋."#"表示陆地,如下所示:........##.....##........##...####....###.. ...
- POJ 2676 - Sudoku - [蓝桥杯 数独][DFS]
题目链接:http://poj.org/problem?id=2676 Time Limit: 2000MS Memory Limit: 65536K Description Sudoku is a ...
- 蓝桥杯PREV-12(dfs&割点)
题目链接:http://lx.lanqiao.cn/problem.page?gpid=T35 题意:中文题诶- 思路:dfs 假设star 和 end之间总路径数目为ans, 那么若经过路径上某点到 ...
- 蓝桥杯---数独(模拟 || dfs)
[编程题](满分33分) "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数 学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6 ...
- 蓝桥杯---剪格子(DFS&BFS)(小总结)
问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+ ...
- 蓝桥杯之大臣的旅费(两次dfs)
Description 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个 ...
- 蓝桥杯之剪格子(经典dfs)
如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+--+-- ...
随机推荐
- Activation HDU - 4089(概率dp)
After 4 years' waiting, the game "Chinese Paladin 5" finally comes out. Tomato is a crazy ...
- beam 的异常处理 Error Handling Elements in Apache Beam Pipelines
Error Handling Elements in Apache Beam Pipelines Vallery LanceyFollow Mar 15 I have noticed a defici ...
- codeforces-1141 (div3)
A.算2,3的因子个数即可 #include <map> #include <set> #include <ctime> #include <cmath> ...
- busybox(三)最小根文件系统
目录 busybox(三)最小根文件系统 引入 构建终端 构造inittab 配置应用程序 构建C库 制作映像文件yaffs title: busybox(三)最小根文件系统 tag: arm dat ...
- openstack项目【day23】:keystone组件HTTP协议
阅读目录 一 为何要学习HTTP协议 二 用户上网过程 三 HTTP协议 part1 http协议概述 part2 请求协议 part3 响应协议 四 抓包分析HTTP协议 一 为何要学习HTTP协议 ...
- MySQL学习笔记(四)悲观锁与乐观锁
恼骚 最近在搞并发的问题,订单的异步通知和主动查询会存在并发的问题,用到了Mysql数据库的 for update 锁 在TP5直接通过lock(true),用于数据库的锁机制 Db::name('p ...
- LFYZ-OJ ID: 1016 输油管道问题
分析 根据之前的证明,我们已经知道最佳输油管线的y位置就是所有油井y坐标序列的中位数,故解题过程为: 1. 读入n个y数据 2. 对n个y数据进行排序(升序或降序) 3. 求中位数zws 4. 计算输 ...
- [再寄小读者之数学篇](2014-11-02 Herglotz' trick)
设 $f$ 是 $\bbR$ 上周期为 $1$ 的连续可微函数, 满足 $$\bee\label{141102_f} f(x)+f\sex{x+\frac{1}{2}}=f(2x),\quad\for ...
- 牛牛与数组 (简单dp)
题目链接 这种题一看就是dp啊,dp[i][j]表示第i位放j的方案数,转移方程为dp[i][j]=dp[i-1][k]{k<=i||k%i!=0},当然我们可以三层循环来找,但数据显然会超时, ...
- 【JS】长轮询
循环请求服务器数据 function send () { xhr.open('GET', '/clock', true); xhr.onreadystatechange = function () { ...