尋路Python Algorithm Backtracking

給定一個(gè)像board的矩陣,我想找到一條路徑,讓我找到更多的數(shù)1's,知道我只能向上(n+1)和右(m+1)。我正在嘗試使用回溯解決方案,我設(shè)法知道在最佳路徑上可以找到多少1's,但我無法計(jì)算出如何打印最佳路徑的坐標(biāo)。

board=[[0,0,0,0,1,0],
       [0,1,0,1,0,0],
       [0,0,0,1,0,1],
       [0,0,1,0,0,1],
       [1,0,0,0,1,0]]

def findPath(board,n,m):
    noo=0
    if board[n][m]>0:
        noo+=1
    if n==len(board)-1 and m==len(board[0])-1:
        return noo
    if n==len(board)-1:
        noo+=findPath(board,n,m+1)
    elif m==len(board[0])-1:
        noo+=findPath(board,n+1,m)
    else:
        noo+=max(findPath(board,n,m+1),findPath(board,n+1,m))
    return noo

print(findPath(board,0,0))

我應(yīng)該如何或在哪里實(shí)現(xiàn)print(n,m)來打印最佳路徑的每個(gè)網(wǎng)格的坐標(biāo)

EDITED

而是想出了這個(gè)解決方案

def path(board,x,y,xl,yl,sol,index,paths):
    sol.append([x,y])
    solaux=sol
    if x==0 and y==0:
        pass
    if board[x][y]>0:
        sol[0]+=1
    if x==xl-1 and y==yl-1:
        paths.append(sol)
        print(sol)
        return paths
    if x==xl-1:
        path(board,x,y+1,len(board),len(board[0]),sol,index,paths)
    elif y==yl-1:
        path(board,x+1,y,len(board),len(board[0]),sol,index,paths)
    else:
        index= len(sol)
        auxnoo= sol[0]
        path(board,x,y+1,len(board),len(board[0]),sol,index,paths)
        sol = sol[0:index]
        sol[0]=auxnoo
        path(board,x+1,y,len(board),len(board[0]),sol,index,paths)
    return paths
? 最佳回答:

一開始,您的實(shí)現(xiàn)效率非常低,因?yàn)槟啻螌蝹€(gè)單元執(zhí)行findPath。例如,如果您有2x2網(wǎng)格,則單元(1,1)將被訪問兩次:

(1, 0) -- path 2 --> (1, 1)
   ^                   ^
   | path 2            | path 1
   |                   |
(0, 0) -- path 1 --> (0, 1)

讓我們記住每個(gè)單元格的noo值:

# noo[i][j] == None value means value for cell wasn't calculated before.
# Otherwise noo[i][j] it means calculated answer for cell.
noo=[[None for i in range W] for j in range H]

def findPath(board,n,m):
    if noo[n][m] is not None:
        return noo[n][m]
    noo[n][m] = board[n][m]
    if n==len(board)-1 and m==len(board[0])-1:
        return noo[n][m]
    if n==len(board)-1:
        noo[n][m]+=findPath(board,n,m+1)
    elif m==len(board[0])-1:
        noo[n][m]+=findPath(board,n+1,m)
    else:
        noo[n][m]+=max(findPath(board,n,m+1),findPath(board,n+1,m))
    return noo[n][m]

print(findPath(board,0,0))

我應(yīng)該如何或在哪里實(shí)現(xiàn)print(n,m)來打印最佳路徑的每個(gè)網(wǎng)格的坐標(biāo)

其次,沒有簡單的方法將print(n,m)放入給定的代碼中,因?yàn)閷τ谝粋€(gè)我們不知道它是否屬于任何最優(yōu)路徑的給定單元。只有當(dāng)我們回到cell(0,0)時(shí)我們才能確定它。

但是現(xiàn)在我們有了2d數(shù)組noo:如果noo[i][j]包含值x,那么最佳方向?qū)⑹窍鄬τ趩卧瘢╥,j)到下一個(gè)右上單元格(i1,j1)的noo[i1][j1] >= x - 1noo[i1][j1]可以等于x如果board[i][j] == 0x - 1如果board[i][j] == 1)。讓我們實(shí)現(xiàn)最佳路徑打印機(jī):

def printOptimalPath(n, m):
    print(n, m)
    if n < len(board)-1 and noo[n + 1][m] == noo[n][m] - board[n][m]:
        printOptimalPath(n + 1, m)
    elif m < len(board[0])-1 and noo[n][m + 1] == noo[n][m] - board[n][m]:
        printOptimalPath(n, m + 1)

# Usage
printOptimalPath(0, 0)

注意,如果noo[n+1][m]noo[n][m+1]都滿足上述條件,則意味著存在不止一條最佳路徑,您可以選擇任何方向。

主站蜘蛛池模板: 国产MD视频一区二区三区| 视频一区视频二区日韩专区| 无码日韩人妻AV一区免费l| 免费萌白酱国产一区二区三区| 亚洲国产AV无码一区二区三区| 欧洲精品一区二区三区在线观看| 一区二区三区在线|欧| 视频一区二区在线观看| 在线精品一区二区三区电影| 精品无码一区二区三区爱欲九九| 波多野结衣的AV一区二区三区| 国产凸凹视频一区二区| 尤物精品视频一区二区三区| 日产亚洲一区二区三区| 午夜影视日本亚洲欧洲精品一区| 国模大尺度视频一区二区| 国产激情一区二区三区 | 加勒比精品久久一区二区三区| 爱爱帝国亚洲一区二区三区| 国产亚洲一区二区三区在线观看 | 一区二区三区亚洲视频| 日本高清天码一区在线播放| 亚洲国产欧美国产综合一区| 人妻互换精品一区二区| 色一情一乱一伦一区二区三欧美 | 国内精品视频一区二区三区八戒| 色婷婷一区二区三区四区成人网 | 精品国产一区二区三区无码| 免费av一区二区三区| 无码一区二区三区在线观看| 精品一区二区久久久久久久网站| 国产丝袜无码一区二区三区视频 | 一区二区三区免费视频观看| 国产一区二区三区在线| 亚洲国产精品成人一区| 国产成人久久精品区一区二区 | 无码精品尤物一区二区三区| 精品熟人妻一区二区三区四区不卡| 精品无码人妻一区二区三区品 | 免费一区二区无码东京热| 在线观看午夜亚洲一区|