《华为机试》刷题之HJ43 迷宫问题

一、题目

在这里插入图片描述

二、示例

在这里插入图片描述

三、代码

# 代码1
def fun(i, j, pos=[]):
    if j+1 < n and temp[i][j+1] == 0: # 向右
        if (i, j+1) not in pos:
            fun(i, j+1, pos + [(i,j+1)])
    if j-1 >= 0 and temp[i][j-1] == 0: # 向左
        if (i, j-1) not in pos:
            fun(i, j-1, pos + [(i, j-1)])
    if i+1 < m and temp[i+1][j] == 0: # 向下
        if (i+1, j) not in pos:
            fun(i+1, j, pos + [(i+1, j)])
    if i-1 >= 0 and temp[i-1][j] == 0: # 向上
        if (i-1, j) not in pos:
            fun(i-1, j, pos + [(i-1, j)])
    if (i,j) == (m-1, n-1):
        print('(0,0)')
        for item in pos:
            print('(' + ','.join(map(str, item)) + ')')

while True:
    try:
        m, n = list(map(int, input().split()))
        temp = []
        for i in range(m):
            temp.append(list(map(int, input().split())))
        fun(0, 0)
    except:
        break
# 代码2
def dfs(i,j):
    dp_x = [0,0,-1,1]
    dp_y = [-1,1,0,0]
    if i == m-1 and j == n-1:
        for pos in res:
            print('(' + str(pos[0]) + ',' + str(pos[1]) + ')')
        return None
    for k in range(4):
        x = i + dp_x[k]
        y = j + dp_y[k]
        if x >= 0 and x < m and y >= 0 and y < n and temp[x][y] == 0:
            temp[x][y] = 1
            res.append((x,y))
            dfs(x,y)
            temp[x][y] = 0
            res.pop()

while True:
    try:
        m, n = list(map(int,input().split()))
        temp = []
        for i in range(m):
            s = list(map(int,input().split()))
            temp.append(s)
        res = [(0,0)]
        temp[0][0] = 1 # 初始值标记为已访问
        dfs(0, 0)
    except:
        break

四、算法说明

  • 针对代码1:
    采用dfs算法,定义子函数fun(),分别向右、向左、向下、向上移动,如果可以走通,将当前位置存入列表pos,继续递归调用函数fun(),终止条件为,当前位置等于终点位置,打印输出列表pos

  • 针对代码2:
    同样采用采用dfs算法,定义递归函数dfs(i, j),将向右、向左、向下、向上的移动,用列表表示,然后逐个遍历,如果当前位置可以走通,并且没有被走过,也就是标志位temp[x][y] == 0,则将标志位置1,将新的位置递归调用函数dfs(i, j),注意:在递归回溯的时候,要将置1的位置释放,重新归0.

胡萝卜

2022年3月15日12:48:37

我不知道将去向何方,但我已在路上!
时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 !
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

O_胡萝卜_O

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值