算法笔记之深度优先搜索(迷宫问题)

//迷宫问题的最短路径
#include <iostream>
using namespace std;
int n, m, p, q, min = (1 << 31) - 1;//地图有m行n列, 需要到(p, q)
int a[51][51];		//0为空地,1为障碍物
bool book[51][51];	//未走过为false,走过为true
void dfs(int x, int y, int step)
{	
	int next[4][2] = {
		{0, 1},
		{1, 0},
		{0, -1},
		{-1, 0},
	};	//必须放到函数里面
	int tx, ty, k;
	if (x == p && y == q) {
		//cout << step << endl;
		if (step < min) min = step;
		return;		//这个return很关键
	}
	for (k = 0; k < 4; k++) {
		tx = x + next[k][0];
		ty = y + next[k][1]; //下一步的位置
		if (tx<1 || tx>n || ty<1 || ty>m)continue;//如果出界换方向
		if (a[tx][ty] == 0 && book[tx][ty] == false) {
			book[tx][ty] = true;	//标记
			dfs(tx, ty, step + 1);	//递归尝试下一个点
			book[tx][ty] = false;	//尝试结束,回溯
		}
	}
	return;
}
int main() {
	int startx, starty;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			cin >> a[i][j];	//和24行判断出界方向对应,所以是从1开始
	cin >> startx >> starty >> p >> q;
	book[startx][starty] = true;//起点已在路径中,防止重复走
	dfs(startx, starty, 0);//刚开始一步都没有走
	cout << min << endl;
	return 0;
}
/*
基本模型
void dfs(int step){
	判断边界
	for(int i = 0; i<n; i++){//尝试每一种可能
		
		dfs(step + 1);//继续下一步

	}
	return;
}
*/
/*
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3
*/
发布了41 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/dzydzy7/article/details/81674694