一、题目
二、示例
三、代码
# 代码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
我不知道将去向何方,但我已在路上! |
---|
时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 ! |