深搜-迷宫

思路

      一.主函数

  1. 首先输入起点与终点的位置,再输入障碍的个数。并建立一个坐标的二维数组,初始化为0
  2. 用for循环依次输入障碍的坐标,并将其对应的二维数组的值赋值为1

接着以起点进行深搜即dfs

二.dfs函数

  1. 先写出if条件语句 即不撞南墙不回头中的南墙

         (1)判断是否越界

	if (k<1 || k>n) return;
	if (l<1 || l>m) return;

          (2)判断是否为障碍物或者已经走过的格子

if (a[k][l] == 2)
        return;

在此处将走过的格子等同于障碍物

         (3)判断是否已到达终点

if (k == x2 && l == y2) {
		sum++;
		return;
	}

2.如果上述条件都不符合就代表此时位置没有走过,并且不是障碍物,也不是终点处

那么

首先

让此时的坐标数组对应值为2,代表已经走过

其次

进入递归部分

dfs(k + 1, l);
dfs(k-1, l);
dfs(k, l + 1);
dfs(k, l - 1);

一层一层递归当遇到满足上述if语句的坐标时,会回到上一层,选择其他路径,以此往复。

直到最外层的四层递归都结束

最后

	a[k][l]=0;

代表每结束一层递归就要使其恢复0,这样走另外一条路时也可以通过这个节点

完整代码如下:

#include <iostream>
using namespace std;
int n, m, t,x1,y1,x2,y2,z1,z2,sum=0;
int a[100][100];
void dfs(int k, int l) {
	if (k<1 || k>n) return;
	if (l<1 || l>m) return;
		if (a[k][l] == 2)
        return;
	if (k == x2 && l == y2) {
		sum++;
		return;
	}

	a[k][l] = 2;
	dfs(k + 1, l);
	dfs(k-1, l);
	dfs(k, l + 1);
	dfs(k, l - 1);
	a[k][l]=0;

	
}
int main()
{
	cin >> n >> m >> t;
	cin >> x1 >> y1 >> x2 >> y2;
	for (int i = 1;i <= n;i++) {
		for (int j = 1;j <= m;j++) {
			a[i][j] = 0;
		}
	}
	for (int i = 1;i <= t;i++) {
		cin >> z1 >> z2;
		a[z1][z2] = 2;

	}
	
	dfs(x1, y1);
	cout << sum;
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值