【2024.2.1练习】01迷宫

题目描述


题目思路

一开始想用动态规划,但是这道题没有明显的顺序性和递推关系可以找,起点也是自定义的,鉴于迷宫尺寸不大,考虑使用DFS或BFS。

在自己推算几遍后发现,假设可以在地图上畅通无阻,那么格子只有可能像棋盘一样排列:

01010
10101
01010
10101
01010

用理想的格子与实际输入的图进行对比,找出存在差异的格子,这些格子便是不能通行的。

然后再从起点开始进行DFS/BFS,搜索出总共能够通行的格子数。

此外还有一个重要的优化,由于输入的起点个数极大,为10^5,不可能每次输入起点都要重新进行一次搜索,因此对整个图的记忆化应该在输入起点之前就完成,这时输入起点坐标只需在直接给出二维数组中的对应结果即可。


我的代码

最开始我的dfs函数如下:

#include <iostream>
#include <algorithm>
using namespace std;
int map[1002][1002];
int ans[1002][1002];
int n;
int m;
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
int answer;

void dfs(int x, int y) {
	ans[x][y]++;
	answer++;
	for (int i = 0; i < 4; i++)
	{
		int nx = x + dx[i];
		int ny = y + dy[i];
		if (ans[nx][ny] == 0 && map[x][y]==map[nx][ny]) {
			dfs(nx, ny);
		}
	}
	ans[x][y] = answer;
}
int main() {
	int i;
	int j;
	cin >> n >> m;
	//限定边界
	for (i = 0; i <= n+1; i++)
	{
		map[i][n+1] = 2;
		map[i][0] = 2;
		map[0][i] = 2;
		map[n+1][i] = 2;
	}
	//初始化地图
	for (i = 1; i <= n; i++)
	{
		for ( j = 1; j <= n; j++)
		{
			char x = '1';
			if ((i + j) % 2 == 0) {
				x = '0';
			}
			char y;
			cin >> y;
			if (x == y) {
				map[i][j] = 0;
			}
			else {
				map[i][j] = 1;
			}
		}
	}
	//初始化每个格子的答案
	for (int A = 0; A <= n + 1; A++)
	{
		for (int B = 0; B <= n + 1; B++)
		{
			ans[A][B] = 0;
		}
	}
	//深度优先搜索
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++) {
			if (ans[i][j] == 0) {
				answer = 0;
				dfs(i, j);
			}
		}
	}
	while (m--) {
		int x;
		int y;
		cin >> x >> y;
		cout << ans[x][y]<<endl;
	}
	return 0;
}

代码测试了很多次没问题,样例也过了,可测试点全错误。仔细一看,果然还是递归函数写得有问题:在递归之前计数,answer自增;递归结束之后获取最终信息answer,看似合理,实则只能给搜索起点及周围的方格正确赋值,一旦接近递归边界,有些分支无法赋到正确的值。

这也给我了一个启示:如果要在DFS中计算总搜索格数或次数(或由叶子结点向上传递信息),最终获得完整信息的只能是根结点。

修改后使用栈容器存储搜索过的方格坐标,一次DFS彻底完成后再将搜索过的方格统一赋值。

正确代码:

#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
stack<pair<int, int>> stk;
int map[1002][1002];
int ans[1002][1002];
int n;
int m;
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
int answer;

void dfs(int x, int y) {
	ans[x][y]++;
	answer++;
	//对组入栈
	pair<int, int> p(x, y);
	stk.push(p);
	for (int i = 0; i < 4; i++)
	{
		int nx = x + dx[i];
		int ny = y + dy[i];
		if (ans[nx][ny] == 0 && map[x][y]==map[nx][ny]) {
			dfs(nx, ny);
		}
	}
	ans[x][y] = answer;
}
int main() {
	int i;
	int j;
	cin >> n >> m;
	//限定边界
	for (i = 0; i <= n+1; i++)
	{
		map[i][n+1] = 2;
		map[i][0] = 2;
		map[0][i] = 2;
		map[n+1][i] = 2;
	}
	//初始化地图
	for (i = 1; i <= n; i++)
	{
		for ( j = 1; j <= n; j++)
		{
			char x = '1';
			if ((i + j) % 2 == 0) {
				x = '0';
			}
			char y;
			cin >> y;
			if (x == y) {
				map[i][j] = 0;
			}
			else {
				map[i][j] = 1;
			}
		}
	}
	//初始化每个格子的答案
	for (int A = 0; A <= n + 1; A++)
	{
		for (int B = 0; B <= n + 1; B++)
		{
			ans[A][B] = 0;
		}
	}
	//深度优先搜索
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++) {
			if (ans[i][j] == 0) {
				answer = 0;
				dfs(i, j);
				while (!stk.empty()) {
                    //储存过的坐标赋值并出栈
					ans[stk.top().first][stk.top().second] = answer;
					stk.pop();
				}
			}
		}
	}

	while (m--) {
		int x;
		int y;
		cin >> x >> y;
		cout << ans[x][y]<<endl;
	}
	return 0;
}

很有对于才学尚浅的我而言是一道很有营养的题目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/364830.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

书签管理和稍后阅读工具Readeck

什么是 Readeck ? Readeck 是一个简单的 Web 应用程序&#xff0c;可让您保存您喜欢并希望永久保留的网页的宝贵可读内容。将其视为书签管理器和稍后阅读工具。 网络上的内容每天都会消失。很可能您几个月前偶然发现的一篇文章或图片现在已经消失了。当您在 Readeck 中保存某些…

运维SRE-02 正则表达式、grep

1.特殊符号补充 1.1位置相关的特殊符号 . 当前目录 .. 当前目录的上级目录 ~ 当前用户家目录 / 根目录 cd - 返回上次所在目录1.2熟练掌握 # 注释符号,root命令提示符 | 管道符号.1.3了解其他特殊符号 $ 取值(取出变量的值),普通用户的提示符 ! % ^ & * (){} [] ; ? \…

Quick BI中lod函数之lod_fixed

一、lod函数简介 LOD函数的全称是详细级别表达式&#xff08;Level Of Detail Expressisons&#xff09;。它主要是为了克服一些表达式之间计算颗粒度不一致的问题。比如&#xff0c;要计算第一季度各月销售收入占比&#xff0c;这里分子计算颗粒度为’月’&#xff0c;但是分…

2024年美国大学生数学建模D题思路分析 - 大湖区水资源问题

# 1 赛题 问题D&#xff1a;大湖区水资源问题 背景 美国和加拿大的五大湖是世界上最大的淡水湖群。这五个湖泊和连接的水道构成了一个巨大的流域&#xff0c;其中包含了这两个国家的许多大城市地区&#xff0c;气候和局部天气条件不同。 这些湖泊的水被用于许多用途&#xff…

TypeScript 学习笔记(Day4)

「写在前面」 本文为 b 站黑马程序员 TypeScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. TypeScript 学习笔记&#xff08;Day1&#xff09; 2. TypeScript 学习笔…

大力说视频号第三课:手把手教你视频号如何认证

视频号生态不断完善&#xff0c;越来越多的创作者认识到视频号认证的重要性。微信视频号认证不但能提升搜索排名&#xff0c;还能直播推流、与企业微信的关联等优势。 今天大力就来向大家介绍一下视频号如何做认证。 01 个人认证 个人认证又包括兴趣认证和职业认证。 A、兴趣…

基于Java SSM框架实现校园快领服务系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现校园快领服务系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于校园快领服务系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了…

保姆级的指针详解(超详细)

目录 一.内存和地址  1.初识指针 2.如何理解编址 二. 指针变量 三.指针的解引用操作符 1.指针变量的大小 四.指针变量类型的意义 五.指针的运算 1.指针加减整数 2.指针减指针 3.野指针 3.1指针未初始化 3.2指针越界访问 3.3指针指向的空间被提前释放 3.4如何规…

Rust学习之Features

Rust学习之Features 一 什么是 Features二 默认 feature三 简单的features应用示例四 可选(optional)的依赖五 依赖的特性5.1 在依赖表中指定5.2 在features表中指定 六 命令行中特性控制七 特性统一路径八 其它8.1 相互排斥特性8.2 观察启用特性8.3 [Feature resolver version…

从源码角度透视QTcpServer:解构QTcpServer的底层原理与技术细节

深入了解QTcpServer的底层原理和技术细节 一、背景二、QTcpServer的基本原理2.1、TCP协议简介2.2、QTcpServer的概念 三、QTcpServer源码解析3.1、QTcpServer的构造函数3.2、调用listen函数启动tcpserver3.3、QSocketNotifier的实现 总结 一、背景 QTcpServer是Qt网络模块中的…

花瓣网美女图片爬取

爬虫基础案例01 花瓣网美女图片 网站url&#xff1a;https://huaban.com 图片爬取 import requests import json import os res requests.get(url "https://api.huaban.com/search/file?text%E7%BE%8E%E5%A5%B3&sortall&limit40&page1&positionsear…

『C++成长记』string使用指南

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、string类介绍 二、string类的常用接口说明 &#x1f4d2;2.1string类对象的常…

数据结构+算法(第10篇):叉堆“功夫熊猫”的速成之路

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

Elasticsearch:集群故障排除和优化综合指南

Elasticsearch 是一个强大的搜索和分析引擎&#xff0c;是许多数据驱动应用程序和服务的核心。 它实时处理、分析和存储大量数据的能力使其成为当今快节奏的数字世界中不可或缺的工具。 然而&#xff0c;与任何复杂的系统一样&#xff0c;Elasticsearch 可能会遇到影响其性能和…

【ACL 2023】Enhancing Document-level EAE with Contextual Clues and Role Relevance

【ACL 2023】Enhancing Document-level Event Argument Extraction with Contextual Clues and Role Relevance 论文&#xff1a;https://aclanthology.org/2023.findings-acl.817/ 代码&#xff1a;https://github.com/LWL-cpu/SCPRG-master Abstract 与句子级推理相比&…

linux中的静态库和共享库

库&#xff1a;库是二进制文件&#xff0c;是源代码文件的另一种表现形式&#xff0c;是加了密的源代码&#xff1b;是一些功能相近或者相似函数的集合体 库的使用&#xff1a; 头文件--包含了库函数的声明 库文件--包含了库函数的代码实现 注意&#xff1a;库不能单独使用…

应用智能家居领域中的低功耗蓝牙模块

智能家居&#xff08;smart home, home automation&#xff09;是以住宅为平台&#xff0c;利用综合布线技术、网络通信技术、 安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成&#xff0c;构建高效的住宅设施与家庭日程事务的管理系统&#xff0c;提升家居安…

某零售公司竞聘上岗项目成功案例纪实

——建立科学选人标准、评价方法&#xff0c;实现人岗匹配 【客户行业】零售业&#xff1b;销售行业 【问题类型】竞聘上岗 【客户背景】 半月&#xff08;化名&#xff09;有限公司成立于2008年&#xff0c;以母婴零售为基础&#xff0c;始终坚持以客户为导向&#xff0c;…

Stable diffusion使用和操作流程

Stable Diffusion是一个文本到图像的潜在扩散模型,由CompVis、Stability AI和LAION的研究人员和工程师创建。它使用来自LAION-5B数据库子集的512x512图像进行训练。使用这个模型,可以生成包括人脸在内的任何图像,因为有开源的预训练模型,所以我们也可以在自己的机器上运行它…

第1章 简单使用 Linux

第1章 简单使用 Linux 1.1 Linux 的组成 1.2 远程连接 首先以 root 用户登录到 Linux 系统&#xff0c;然后在 Terminal 终端上输入 ip add 命令&#xff0c;来查看 IP 地址。 上图中的 192.168.72.128 就是 IP 地址。 然后打开 XShell 远程连接工具。 然后在命令提示符下输…