当前位置: 首页 > news >正文

P8662 [蓝桥杯 2018 省 AB] 全球变暖--DFS

P8662 [蓝桥杯 2018 省 AB] 全球变暖--dfs

      • 题目
  • 解析
    • 讲下DFS
      • 代码

题目

在这里插入图片描述

解析

这道题的思路就是遍历所有岛屿,判断每一块陆地是否会沉没。对于这种图的遍历,我们首先应该想到DFS。

代码的注意思想就是,在主函数中遍历找出所有岛屿,将其用DFS遍历判断其所有陆地。

注意一下代码中的细节:

1.主函数每次给dfs传岛屿时,需要初始化t(记录岛屿是否会沉没
2.每次用完一个岛屿,将其重新命为其他符号,做标记(DFS核心

讲下DFS

深度优先搜索(DFS)是一种用于遍历或搜索树、图或网格结构的算法,其核心思想是“尽可能深地探索分支,直到尽头再回溯”。

适合使用DFS的场景:
1.连通区域遍历
问题类型:需要找到所有相连的区域(如岛屿、迷宫中的连通路径)。
示例:统计地图中的岛屿数量、标记病毒感染的区域。

2.路径问题
问题类型:寻找从起点到终点的所有可能路径(如迷宫、棋盘游戏)。
示例:判断迷宫是否有出口,计算八皇后问题的解法。

3.状态空间搜索
问题类型:需要穷举所有可能状态的问题(如排列组合、子集生成)。
示例:生成所有可能的括号组合、排列数字。

总结
使用DFS的时机:需要遍历所有可能路径、处理连通区域、或状态空间搜索时。

代码

#include <iostream>
#include <vector>
#include <set>
#include <cstring>
#include <algorithm>
#include <math.h>
#include <queue>
#include <climits>  // 包含INT_MAX常量
#include <cctype>
using namespace std;
int n, book[1010][1010], cnt, t, ans, sum;
char map[1010][1010];

int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};

void dfs(int x, int y) {
	if (!t) {
		cnt = 0;
		//判断该点【陆地】是否会被淹没用t标记
		for (int i = 0; i < 4; i++) {
			if (map[x + dx[i]][y + dy[i]] != '.')
				cnt++;
			if (cnt == 4) {
				ans += 1;
				t = 1;
			}
		}
	}
	map[x][y] = '*';//标记用过的点
	//开始遍历岛屿上的其他点【陆地】
	for (int i = 0; i < 4; i++) {
		int nx = x + dx[i], ny = y + dy[i];
	//越界or不是陆地就跳出
		if (nx < 0 || nx >= n || ny < 0 || ny >= n || map[nx][ny] != '#')
			continue;
		//继续判断该岛屿的其他陆地
		dfs(nx, ny);
	}
}

int main() {
	cin >> n;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			cin >> map[i][j];
	for (int i = 1; i < n - 1; i++) {
		for (int j = 1; j < n - 1; j++) {
			if (map[i][j] == '#') { //找到岛屿,调用dfs遍历岛屿中的所有陆地
				sum++;
				t = 0;//用于标记该岛屿是否会沉
				dfs(i, j);
			}
		}
	}
	cout << sum - ans << endl;//总岛屿数 - 不会沉没的岛屿数
	return 0;
}

相关文章:

  • Nginx(基础安装+配置文件)
  • [PWNME 2025] PWN 复现
  • GPU编程实战指南02:CUDA开发快速上手示例
  • C++20 格式化库:强大的字符串格式化工具
  • 【网络】TCP常考知识点详解
  • IDEA Commit 模态提交界面关闭VS开启对比
  • 2025最新比较使用的ai工具都有哪些,分别主要用于哪些方面?
  • 静态时序分析STA——2. 数字单元库-(2)
  • 海思Hi3516DV00移植yolov5-7.0的模型转化流程说明
  • 蓝桥杯备赛:一道数学题(练思维(同余的应用))
  • 大白话react第十四章高阶 React 组件开发和React 状态管理进阶等
  • 【机械视觉】C#+VisionPro联合编程———【三、加载CogToolBlock工具详解,以及实例】
  • VS2022中使用EntityFrameworkCore连接MySql数据库方法
  • HeapDumpBeforeFullGC和HeapDumpOnOutOfMemoryError区别
  • Win10 访问 Ubuntu 18 硬盘
  • 数列分块入门2
  • Linux系统下安装配置 Nginx 超详细图文教程_linux安装nginx
  • 笔记:代码随想录算法训练营day38: LeetCode322. 零钱兑换、279.完全平方数、139.单词拆分;多重背包
  • 接口技术##汇编语言
  • QSplitter保存和读取
  • 建公司网站需要多少钱/seo前景
  • 网站主体必须要与域名注册人相同/加强网络暴力治理
  • 文件备案网站建设方案/一般的电脑培训班要多少钱
  • 网站做302重定向会怎么样/seochan是什么意思
  • 外贸网络整合营销推广方案/seo sem
  • 邮轮哪个网站是可以做特价/网站安全