笔试题记录 - 网格中的路径规划问题(python)

题目:有一个二维数组,row=2,col=n(要求输入),"." 表示可以走,“X” 表示障碍物,问从左上角走到右下角有多少条路。方式:只能→,↗,↘

testcase:
5
..x.x
xx...
n=int(input("len: "))
map=[]
for i in range(2):
    map.append(list(input()))
'''
['.', '.', 'x', '.', 'x']
['x', 'x', '.', '.', '.']'''
# move_dict = {"→": (0, 1), "↘": (-1, 1), "↗": (1, 1)}

'''(1) 暴力递归法'''
def solution1(M,N,m,n,map): #m,n是当前点
    if map[m][n] != ".":return 0
    if m==M-1 and n==N-1:return 1 # 到终点,计数加一
    # 分情况,点走到第一行时只有→,↘;而走在第二行,只有→,↗
    if m==0: # 在第一行,→,↘
        if not n==N-1:return solution1(M,N,m,n+1,map)+ solution1(M,N,m+1,n+1,map)
        else:return 0 # 右上角那个点无法到终点
    else: #在第二行,→,↗
        return solution1(M, N, m, n + 1,map) + solution1(M, N, m - 1, n + 1,map)
print("solution1:",solution1(2,n,0,0,map))

'''(2)动态规划'''
def solution_dp(M,N,map):
    arr=[[0 for i in range(N)] for i in range(M)]
    arr[0][0]=1
    # 要竖着遍历,本题因为只有2行,n列,规律:第i列的每一个=第i-1列的和,但是如果为障碍物则0
    for n in range(1, N):# 列
        for m in range(M): # 行
            if map[m][n]!='.':continue
            if m==0:
                arr[m][n]=arr[m][n-1]+arr[m+1][n-1]
            else:
                arr[m][n] = arr[m][n - 1] + arr[m -1][n - 1]
    return arr[M-1][N-1]
print("solution_dp=",solution_dp(2,n,map))

笔试题记录 - 网格中的路径规划问题(python)_第1张图片

更多延升题参考

你可能感兴趣的:(面试/笔试,简单算法题)