走迷宫---dfs在矩阵图里的应用模板

题目描述如下:

dfs算法解决迷宫问题的一个标准模板 ,通过递归与回溯暴力遍历所有能走的点,并比较找出所有可行方案的最优解

解决这道问题的核心思想和组合数如出一辙,可以说是组合数的升级版

结合注释看dfs更清晰易懂,这里不再空对空的讲述了

(本题要用bfs写,dfs会超时,但dfs找路径的核心思想是很值得学习的,而且dfs比bfs的代码更简洁更好理解,打oi赛制是可以得到部分分的)

能过样例的代码如下:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N=110;
int a[N][N];
bool check[N][N];//记录该位置是否走过(保证一个方案内不回头)
int mi=1e8;//最小步数,初始化为无穷大 
void dfs(int stx,int sty,int step){//stx->start x,sty->start y
	int next[4][2]={{1,0},{0,-1},{-1,0},{0,1}};//下一步分别走右,下,左,上的方案
	int nx,ny;//将要走到下一个位置的的坐标
	if(stx==n&&sty==m) {//判断是否走到目标位置 
		if(step<mi){//更新最小步数 
			mi=step;
		}
		return;
	}
	for(int k=0;k<4;k++){
		//计算下一个点坐标 
		nx=stx+next[k][0];
		ny=sty+next[k][1];
		//判断是否越界,若越界直接continue重新走下一个方向,不往下递归(走出下一步) 
		if (nx<1||nx>n||ny<1||ny>m){
			continue;
		} 
		//判断下一个点走过没有,判断下一个点是否为障碍物,若不是,则递归(走出下一步) 
		if(check[nx][ny]==false&&a[nx][ny]==0){
			check[nx][ny]=true;//标记为走过(和组合数的模板一样) 
			dfs(nx,ny,step+1);
			check[nx][ny]=false;//回溯的过程,这一步不走了,把卡片拿回来 
		}
	}
} 
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	check[1][1]=true;//标记起点坐标已走过 
	dfs(1,1,0);//传入起点坐标和此时的步数:0 
	cout<<mi;
	return 0;
}
相关推荐
ShiinaMashirol4 小时前
代码随想录打卡|Day27(合并区间、单调递增的数字、监控二叉树)
java·算法
wuqingshun3141596 小时前
蓝桥杯 5. 交换瓶子
数据结构·c++·算法·职场和发展·蓝桥杯
Demons_kirit6 小时前
Leetcode 2845 题解
算法·leetcode·职场和发展
adam_life7 小时前
http://noi.openjudge.cn/——2.5基本算法之搜索——200:Solitaire
算法·宽搜·布局唯一码
我想进大厂7 小时前
图论---朴素Prim(稠密图)
数据结构·c++·算法·图论
我想进大厂7 小时前
图论---Bellman-Ford算法
数据结构·c++·算法·图论
AIGC大时代7 小时前
高效使用DeepSeek对“情境+ 对象 +问题“型课题进行开题!
数据库·人工智能·算法·aigc·智能写作·deepseek
CODE_RabbitV8 小时前
【深度强化学习 DRL 快速实践】近端策略优化 (PPO)
算法
Wendy_robot9 小时前
【滑动窗口+哈希表/数组记录】Leetcode 438. 找到字符串中所有字母异位词
c++·算法·leetcode
程序员-King.9 小时前
day49—双指针+贪心—验证回文串(LeetCode-680)
算法·leetcode·贪心算法·双指针