深度优先搜索(C++代码实现)

深度优先搜索(C++代码实现)

举个例子,比如现在你的位置为(1,1),你需要移动到一个位置(n,m),
并且路途中有多个障碍物阻挡你的前进,求出最少需要移动的次数。

对于这个问题,我们可以使用从起点开始顺时针进行移动(即:先向右,再向下,再
向左,再向上)。并且使用二维数组模拟一下地图。当碰到障碍物的时候进行优先的
顺时针的方向(右->下->左->上)总有一条路能走通,就接着继续走,直到目的地,
这是其中的一条可行的路,然后就模拟所有的路,找到最短的那条即可。

OK,分析完毕,开始写代码:

#include<iostream>
using namespace std;

int n, m, p, q, min = 999999;
int a[51][51], book[51][51];
void dfs(int x, int y, int step) {//其中的坐标为第x行的第y列,即(x,y),左上角即为(1,1)
	int next[4][2] = {
		{0,1},//向右
		{1,0},//向下
		{0,-1},//向左
		{-1,0}//向上
	};
	int tx, ty, k;
	//判断是否到达目的地
	if (x == p && y == q) {
		if (step < min) {
			min = step;
			return;
		}
	}
	for (k = 0; k <= 3; k++) {
		tx = x + next[k][0];
		ty = y + next[k][1];
		//不能越界
		if (tx<1||ty<1||tx>n||ty>m)
		{
			continue;
		}
		if (a[tx][ty]==0&&book[tx][ty]==0)
		{
			book[tx][ty] = 1;//标记一下,走过了
			dfs(tx, ty, step + 1);
			book[tx][ty] = 0;//等到尝试完,取消标记这个点
		}
	}
	return;
}

int main() {
	int i, j, starX, starY;
	cin >> n >> m;
	for (i = 1; i <= n; i++) {
		for (j = 1; j <= m; j++)
		{
			cin >> a[i][j];//输入地图
		}
	}
	cin >> starX >> starY >> p >> q;//输入起点和终点的行列坐标
	book[starX][starY] = 1;//标记起点已经走过
	dfs(starX, starY, 0);
	cout << min;
	return 0;
}

此文章原本发布于: 2020-08-29 16:34:43

由于另一篇文章的需要,以下再补充一下数据结构图章节的深度优先搜索(DFS):

即:给出多个点,再给出连接这些点的路,搜索遍历一遍:
DFS过程:
从起点出发,一路往后走下去,直到没路,或者路的后续节点已经搜索过,此时往回退一个节点进行再继续搜索。
关键代码如下:(python)

seen = set() # 使用不可重复的set存放被搜索过的节点
def DFS(myMap, begin):  # myMap:图(邻接表表示), begin:开始结点
    if len(seen) == len(myMap):
        print(begin)
        return
    seen.add(begin)
    nodes = myMap[begin] #遍历此节点为出发点的所有路
    for y in nodes:
        if y not in seen:  # 判断是否访问过
            seen.add(y)
            print(begin)
            DFS(myMap, y)

可测试代码如下:

myMap={
    'A':['B','C','D'],
    'B':['A','E'],
    'C':['A','D','F'],
    'D':['A','C','E'],
    'E':['B','D','F'],
    'F':['C','E']
}
seen = set() # 使用不可重复的set存放被搜索过的节点
def DFS(myMap, begin):  # myMap:图(邻接表表示), begin:开始结点
    if len(seen) == len(myMap):
        print(begin)
        return
    seen.add(begin)
    nodes = myMap[begin] #遍历此节点为出发点的所有路
    for y in nodes:
        if y not in seen:  # 判断是否访问过
            seen.add(y)
            print(begin)
            DFS(myMap, y)
print(DFS(myMap, 'A'))

测试结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值