📅  最后修改于: 2023-12-03 15:12:45.788000             🧑  作者: Mango
这是关于计算机科学的一道题目。1996届清华大学计算机系的中级程序设计课程考试出现的。
问题描述:给定一个01矩阵,1表示墙,0表示路,你可以从一个起点出发,只能水平或竖直移动到它相邻的0,求到目标点的所有不同路径数。另外,还给出了一个能不能走的判断矩阵,1表示可以,0表示不能。
给出以下Python程序实现:
def dfs(nowx, nowy):
if(nowx == tx and nowy == ty):
global num
num += 1
return
for i in range(4):
newx = nowx + direction[i][0]
newy = nowy + direction[i][1]
if(is_can_walking(newx, newy) and not vis[newx][newy]):
vis[newx][newy] = True
dfs(newx, newy)
vis[newx][newy] = False
def is_can_walking(newx, newy):
return newx>=0 and newy>=0 and newx<n and newy<m and can_walk[newx][newy]
n, m = 0, 0
direction = [(0, -1), (0, 1), (1, 0), (-1, 0)] # 左右下上
can_walk = []
vis = []
sx, sy, tx, ty = 0, 0, 0, 0
num = 0
n, m = map(int, input().split())
for i in range(n):
row = input().strip()
can_walk.append([int(x) for x in row])
vis.append([False]*m)
sx, sy, tx, ty = map(int, input().split())
sx -= 1
sy -= 1
tx -= 1
ty -= 1
vis[sx][sy] = True
dfs(sx, sy)
print(num)
这里提供了一个深度优先搜索(DFS)的思路实现,遍历所有的可能路径,并记录经过的点,最后计算可到达终点的方案总数。我们用 vis[i][j]
表示是否已经经过该点,用 can_walk[i][j]
表示该点是否能否通过,首先我们从起点开始搜索。每次考虑向左或向右或向上或向下移动一个单位,如果对应的新点可行,则 vis
里相应的值设为 True
并且继续 dfs,否则返回上层搜索。当走到终点时统计方案数即可。