走迷宫(深度优先搜索版)

#include<iostream>
using namespace std;
int a[50][50], book[50][50], n, m, p, q;
//定义全局变量,二维数组a用来保存n行m列的迷宫,book数组用来标记。
//p,q为目的地坐标,min记录最小步数 

void dfs(int x, int y, int step); //dfs函数用来解决当前步该怎么办 
int min = 999999;
int main()
{
	int i, j, startx, starty;
	scanf("%d %d", &n, &m);
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	scanf("%d %d %d %d", &startx, &starty, &p, &q);
	book[startx][starty] = 1;
	dfs(startx, starty, 0);
	printf("%d", ::min);
	return 0; 
}

void dfs(int x, int y, int step)
{                                //定义方向数组,计算下一步的坐标 
	int next[4][2] =  { {0, 1},  //向右 
						{1, 0},  //向下 
	                    {0, -1}, //向左 
					    {-1, 0}};//向上

    int tx, ty, k, r;
	if(x == p && y == q) //判断此点是否已经到达目的地 
	{
		if(step < ::min) //到达目的地,若走的步数比之前的小,则更新最小步数 
		{
			::min = step;
		}
		return ;
	}
	else
	{
		for (k = 0; k < 4; k++) //没有到达目的地则从从不同方向尝试下一步 
		{
			r = 1;          //r先置为1 
			tx = x + next[k][0];  //tx,ty即为尝试移动后点的坐标 
			ty = y + next[k][1];
			if (tx < 0 || tx >= n || ty < 0 || ty >= m) //判断如果越界,这次尝试不用继续下去,跳过本次循环 
			{
				r = 0;
			}
			if (r) //如果没有越界 
			{
				if (a[tx][ty] == 0 && book[tx][ty] == 0) //确定是否为障碍物或者是否该点已经走过 
				{
					book[tx][ty] = 1; //满足条件则把该点标记 
					dfs(tx, ty, step + 1); //从该点开始尝试下一次 
					book[tx][ty] = 0; //尝试完一种后,把该点再次重置,方便下次尝试 
				}
			}
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值