【洛谷】P1605 迷宫(dfs) 题解

2023-05-16

原题链接:https://www.luogu.org/problem/P1605

题目描述

给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。

输入输出格式

输入格式:

第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。

输出格式:

给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。

输入输出样例

输入样例#1:

2 2 1
1 1 2 2
1 2

输出样例#1:

1

说明

时空限制:1000ms 125M

【数据规模】

1≤N,M≤5

思路:
1、先用数组map[10][10]把没有障碍物的地方标记为1,有障碍物的地方标记为0,用数组vis[10][10]把走过的地方标记为1,没走过的地方标记为0。

2、从起始点开始深搜,分别以四个方向进行深搜,如果下一个点没有障碍物且没有走过,则把这个点标记走过,继续深搜下一个点,状态恢复原样,即回溯。当搜到终止点时路径数+1,返回继续深搜下条路径。

3、有两个点必须说下,第一是标记没有障碍物不能直接用memset()函数直接标记,要一个点一个点标记;第二是map[x+px[i]][y+py[i]]&&!vis[x+px[i]][y+py[i]] 这条逻辑表达式,不能都等于0,我也不知道为什么(有大佬知道可以评论下),就是会RE和TLE。


代码如下:

#include <iostream>
#include <cstdio>
#include <cstring> 
using namespace std; 
int n,m,t;	//n表示地图行,m表示地图的列,t表示障碍数
int sx,sy,fx,fy;//sx、sy表示起始点的横纵坐标,ex、ey表示结束点的横纵坐标 
int zx,zy;	//zx、zy表示障碍物横纵坐标 
int sum=0;	//表示路径数
int map[10][10];	//表示地图
int vis[10][10]={0};	//走过的点标记为1,没走过标记为0 
int px[4]={0,0,1,-1};	//搜索方向,1表示向右,-1表示向左,0表示不动 
int py[4]={-1,1,0,0}; 	//搜索方向,1表示向下,-1表示向上,0表示不动 
void dfs(int x,int y)
{
	if(x==fx&&y==fy)
	{
		sum++;	//路径数+1 
		return;	//返回,继续搜索下一条路径 
	}
	else
	{
		for(int i=0;i<4;i++)
		{	
			//如果下一个点没有障碍物也没走过 
			if(map[x+px[i]][y+py[i]]&&!vis[x+px[i]][y+py[i]])
			{
				vis[x][y]=1;	//走过的点标记为1
				dfs(x+px[i],y+py[i]);//搜索下一步 
				vis[x][y]=0;	//回溯 
			}
		}
	}
}
int main() 
{
	scanf("%d%d%d",&n,&m,&t);
	scanf("%d%d%d%d",&sx,&sy,&fx,&fy);
	for(int i=1;i<=n;i++)	//不能用memset直接标记 
	{
		for(int j=1;j<=m;j++)
			map[i][j]=1;	//地图先全部标记为1,表示没有障碍物 
	}	
	for(int i=1;i<=t;i++)
	{
		scanf("%d%d",&zx,&zy);
		map[zx][zy]=0;	//把障碍物位置标记为1,表示有障碍 
	} 
	dfs(sx,sy);	//从起始点开始深搜 
	printf("%d",sum);
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【洛谷】P1605 迷宫(dfs) 题解 的相关文章

  • 无向图-邻接链表的深度优先遍历-DFS

    一 DFS思想 本算法以无向网为例 存储方式采用邻接链表1 将该网以邻接链表的方式存储 2 选取A点为起始点 访问此顶点 用一个visit的bool型数组记录访问状态 false表示未被访问 true表示已访问 3 从A的未被访问的邻接点出
  • Acwing 1414.牛异或

    输入样例 5 1 0 5 4 2 输出样例 6 4 5 刚开始看到这个题 我是毫无思绪 看了一下题解 https www acwing com video 2339 老师说这个是最大异或对的变形 于是我去找了一下最大异或对 看完之后我只能想
  • 数字三角形(java)

    问题描述 在数字三角形中寻找一条从顶部到底边的路径 使得路径上所经过的数字之和最大 路径上的每一步都只能往左下或 右下走 只需要求出这个最大和即可 不必给出具体路径 三角形的行数大于1小于等于100 数字为 0 99输入格式 输入格式 5
  • Sum It Up HDU - 1258【DFS】

    Given a specified total t and a list of n integers find all distinct sums using numbers from the list that add up to t F
  • 【笔试面试真题】Java实现数列还原

    题目描述 牛牛的作业薄上有一个长度为 n 的排列 A 这个排列包含了从1到n的n个数 但是因为一些原因 其中有一些位置 不超过 10 个 看不清了 但是牛牛记得这个数列顺序对的数量是 k 顺序对是指满足 i lt j 且 A i lt A
  • 力扣刷题-47.全排列Ⅱ、深度优先搜索

    给定一个可包含重复数字的序列 返回所有不重复的全排列 深度优先搜索 DFS 深度优先搜索就是在每一步对每一种可能的选择一条道走到底 然后再回过头尝试另外一种选择 深度优先搜索的关键是要考虑 当前这一步 该如何做 至于 下一步 该怎么做和当前
  • 已安装的nginx,添加新模块fastdfs-nginx-module

    1 先看nginx的安装位置和运行目录 不清楚的可以使用命令查看 find name nginx 2 确定安装目录和运行目录后 查看当前nginx的安装路径及已安装的模块等信息 usr local nginx sbin nginx V 3
  • 图的遍历方法——DFS和BFS

    DFS类似于树的先序遍历 因此可以用递归实现 BFS类似于树的层次遍历 因此可以用队列实现 说明 下面代码中图的存储方式是邻接表 关于邻接表和邻接矩阵可看邻接表和邻接矩阵 1 深度优先遍历 Depth First Search 思想 从图中
  • 算法---LeetCode 200. 岛屿数量

    1 题目 原题链接 给你一个由 1 陆地 和 0 水 组成的的二维网格 请你计算网格中岛屿的数量 岛屿总是被水包围 并且每座岛屿只能由水平方向和 或竖直方向上相邻的陆地连接形成 此外 你可以假设该网格的四条边均被水包围 示例 1 输入 gr
  • 学渣带你刷Leetcode0017. 电话号码的字母组合

    题目描述 给定一个仅包含数字 2 9 的字符串 返回所有它能表示的字母组合 给出数字到字母的映射如下 与电话按键相同 注意 1 不对应任何字母 示例 输入 23 输出 ad ae af bd be bf cd ce cf 说明 尽管上面的答
  • 路径搜索问题

    之前碰到的很多问题都可以归结为路径搜索问题 就是求两点之间的路经 1 是否存在路径 2 求任意一条路径 3 求所有路径 求是否有路径和任意一条路径的时候 和正常遍历一样 一个点被mark之后不再访问 因为如果这个结点到终点有路径 之前就应该
  • 02 二叉树的DFS(前序、中序或后序遍历实现)【Binary Tree 二叉树】

    二叉树的深度优先遍历主要有三种 前序 根左右 中序 左根右 后序 左右根 下面是完整的实现和讲解 include
  • [LeetCode] Binary Tree Level Order Traversal 二叉树层次遍历(DFS

    目录 1 Binary Tree Level Order Traversal 二叉树层次遍历 BFS 2 Binary Tree Level Order Traversal II 二叉树层次遍历从低往高输出 BFS 3 Maximum De
  • 基础算法题——迷宫(递推)

    迷宫 题目链接 解题思路 暴力法 利用 dfs 遍历每一条可能的路径 将遍历的权值和不断取余 不足 当 n m 取较大的情况下 所遍历的路径可能会暴增 出现超时的情况 递推法 从题目上我们可以发现 最终的权值和是要对 mod 取余的 利用这
  • 【算法学习笔记】17:DFS与BFS

    1 DFS 深度优先搜索常用于解决需要给出所有方案的问题 因为它的搜索顺序就是能够得到一个完整的搜索路径 方案 后回退再去搜索其它的方案 1 1 例题 排列数字 由于要求所有排列的方案 可以每次从 1 n 1 n 1 n里拿一个数字 然后记
  • 牛客剑指offer之【JZ12 矩阵中的路径】

    哈喽 这次真的是好久不见呀 我回来啦 接下来的日子我会不断更新牛客上的剑指offer题解 为什么这么做呢 是因为博主刷题总是刷了忘忘了刷 一样的题目换种形式就要做好久 说到底还是对知识点的理解不够透彻 加之算法对一个即将找工作的大学生来说更
  • 每天进步一点点【图的深度优先遍历(DFS)】

    图是一种数据结构 其中节点可以具有零个或多个相邻元素 两个节点之间的连接称为边 节点也可以称为顶点 图分为三种 无向图 有向图 带权图 图的表示方式有两种 二维数组表示 邻接矩阵 链表表示 邻接表 邻接矩阵 邻接矩阵是表示图形中顶点之间相邻
  • [ACM] 1016 Prime Ring Problem (深度优先搜索)

    Prime Ring Problem Problem Description A ring is compose of n circles as shown in diagram Put natural number 1 2 n into
  • 链式前向星存树图和遍历它的两种方法【dfs、bfs】

    目录 一 链式前向星存图 二 两种遍历方法 一 链式前向星存图 n个点 n 1条边 链式前向星把上面的树图存下来 输入 9 代表要存进去n个点 1 2 下面是n 1条边 每条边连接两个点 1 3 1 7 2 4 4 5 4 6 3 8 3
  • DFS的个人理解和测试例题

    深度优先搜索 DFS 是一种搜索手段 可以理解为 它从某个位置 起点 开始 沿着一条路不断地向前走直到尽头 然后退后一步 去走其它没走过的路 没有的话 再退后一步 再去选择 直到找到目的地 终点 例如下图 从A 起点 开始走 先走ABD 在

随机推荐

  • 飞浆七天深度学习

    文章目录 前言图像处理原理与深度学习入门百度的飞浆实战可视化数据准备可视化效果图片 深度学习原理与使用方法实战手势识别 卷积神经网络原理与使用实战车牌识别分割字符的代码定义MyLeNet网络 经典卷积网络解读数据增强计算VGG的参数小姐姐手
  • Ubuntu18.04安装教程——超详细的图文教程

    电脑配置 xff1a 名称 xff1a Lenovo 拯救者Y7000P 处理器 xff1a i7 10750H 内存 xff1a 32G 固态 xff1a 1TB 显卡 xff1a RTX2060 6G 一 准备工作 本文以 Ubuntu
  • VINS-Course代码解析——run_euroc前端数据处理

    vins mono总框架如下 xff1a 主要分为三大块 xff1a 我们先从主函数 main 入手 xff1a 主函数中有三个线程 xff0c 读取完数据集和配置文件的路径后就会进入这三个线程 xff0c 如下图 xff1a thd Ba
  • C++求解N个数的最大公约数、最小公倍数

    一 2个数的最大公约数 span class token comment 辗转相除法 span span class token keyword int span span class token function gcd span spa
  • 子序列个数——动态规划

    题目 xff1a 统计一个字符串中全部不同的子序列的个数 思路 xff1a 动态规划求解 令 f i 61 前 i 个元素中包含的全部子序列的个数 那么状态转移方程分为下面两种情况 xff1a 当第 i 个元素在前面 i 1 个字符中没有出
  • 字符串中特定子序列出现的次数(动态规划)

    题目 xff1a 给定一个字符串 xff0c 求子序列 cwbc 出现的次数 思路 xff1a 动态规划 令 dp i j 表示前 i 个字符中匹配了字符串 cwbc 中前 j 位 xff08 j 61 1 2 3 4 xff09 的个数
  • 认识node

    一 认识node node是一个基于Chrome V8引擎的JavaScript代码运行环境 浏览器 xff08 软件 xff09 能够运行JavaScript代码 xff0c 浏览器就是JavaScript代码的运行环境 xff08 js
  • python爬虫-使用request,lxml库爬取游戏排名

    爬取目标URL xff1a http wy hao123 com top 开发环境 xff1a PyCharm 2019 2 3Python3 6火狐浏览器 使用的三方库 xff1a requestslxml 执行结果 开始 抓取网页 打开
  • 知识追踪模型——教育大数据挖掘(持续更新......)

    知识追踪 xff08 2015 NIPS xff09 Deep Knowledge Tracing xff08 2017 WWW xff09 Dynamic Key Value Memory Networks for Knowledge T
  • Wireshark从安装到使用详细指南

    前言 wireshark是一款非常优秀的网络封包分析软件 xff0c 具有极为强大的功能 可以截取各种类型的网络封包 xff0c 并且显示网络封包的详细信息 值得一提的是 xff0c 为了安全性考虑 xff0c wireshark无法实现改
  • echarts随dom大小自适应变化,并做防抖处理

    目录 监听窗口resize事件监听dom的resize事件完整代码示例 监听窗口resize事件 监听浏览器窗口resize事件很简单 xff0c 如下一行代码即可搞定 xff1a window span class token punct
  • 极简版qt打包成exe

    文章目录 极简版qt打包成exe附加工具过程 极简版qt打包成exe 附加工具 Engima Virtual Box xff0c 将qt的多个文件打包成一个exe xff0c 下载地址 过程 新建xxx文件夹将初步编译过的xxx exe x
  • Windows10清理C盘的恶意软件

    Windows10清理C盘的恶意软件 写在前面情况1 xff1a 在桌面留有 快捷链接 的情况2 xff1a 在 控制面板 的 卸载软件 中能找到名字情况3 xff1a 在 控制面板 的 卸载软件 中找不到名字1 ludashi birdw
  • 前端的学习之路:初级CSS---关系选择器

    关系选择器 span class token doctype lt DOCTYPE html gt span span class token tag span class token tag span class token punctu
  • 子类继承父类的加载顺序——记录篇

    两种情况的加载顺序 xff1a 初始化阶段的初始化步骤 xff1a 静态代码块 先父类后子类 gt 非静态代码块 gt 父类 先父类后子类 一 单独类的加载顺序 静态变量 静态代码块 xff1a 从上到下的顺序加载 类的非静态变量 xff0
  • “完美”解决Mybatis+PageHelper出现SQL语句末尾自动加limit出现SQL语法错误

    问题比较简单 xff0c 解决方法也比较简单 xff0c 这里简单描述一下 具体描述请看这里 xff1a 问题详细描述 产生原因 Mybatis 43 Pagehelper在执行分页逻辑时时 xff0c 会默认在你的写的SQL语句后面添加l
  • Edge扩展插件安装位置

    Edge插件默认位置在 xff1a C Users Administrator AppData Local Microsoft Edge User Data Default Extensions 若查找不到 xff0c 则您的用户名更改了
  • mac上zsh: command not found:${命令} 失败问题

    重新安装了zsh后 xff0c 输入很多以前能够用的alias命令缩写都不能用了 xff0c 原因 xff1a 原来的命令缩写写在 bash profile文件中 xff0c 这个使用的是bash xff1b 但是zsh是另外一个shell
  • linux安装并卸载图形化界面+克隆虚拟机

    首先我们要了解图形界面有多少 xff0c 以及他们的优缺点都是什么 这篇博客可以让你完美的解决这些问题四种桌面环境的比较 在安装界面以及卸载时 xff0c 我们经常会用到 yum 这一个单词 那么yum到底是什么意思呢 xff1f yum的
  • 【洛谷】P1605 迷宫(dfs) 题解

    原题链接 xff1a https www luogu org problem P1605 题目描述 给定一个N M方格的迷宫 xff0c 迷宫里有T处障碍 xff0c 障碍处不可通过 给定起点坐标和终点坐标 xff0c 问 每个方格最多经过