我正在使用回溯解决骑士之旅问题,但我没有得到想要的结果

Posted

技术标签:

【中文标题】我正在使用回溯解决骑士之旅问题,但我没有得到想要的结果【英文标题】:I am working on knight tour problem using backtracking but i am not getting the desired result 【发布时间】:2020-03-18 16:16:53 【问题描述】:

我尝试了 knight Tour 问题,尽管代码看起来正确,但我始终没有得到正确的答案,它总是返回 -1,即不存在解决方案。 我已经定义了几个函数,第一个是 select,它返回 knight 下一步移动的对,然后将其添加到相应的 i 和 j 值。 然后我有 validate 函数来检查下一步是否正确,如果不是,for循环会进一步迭代,否则如果不是回溯发生。

def select(k):
    list1=[2, 1, -1, -2, -2, -1, 1, 2]
    list2=[1, 2, 2, 1, -1, -2, -2, -1]
    return list1[k],list2[k]    

def validate(chessBoard,i,j):
    if((i>=0)and(i<8)and (j>=0)and(j<8)and(chessBoard[i][j]==0)):
        return 1
    return -1   


def knightTour(chessBoard,total,i,j):
    if(total==64):
        for x in range(0,8):
            print("\n")
            for y in range(0,8):
                print(chessBoard[i][j],end=" ")
        return 1
    else:
        for k in range(0,8):
            row,column=select(k)
            i,j=row+i,column+j
            if(validate(chessBoard,i,j)==1):
                total=total+1
                chessBoard[i][j]=total
                check=knightTour(chessBoard,total,i,j)
                if(check==1):
                    return 1
                total=total-1       
                chessBoard[i][j]=0
    return -1           

#main function

chessBoard=[[1,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0]
            ]
total=0
i,j=0,0
knightTour(chessBoard,total,i,j)

【问题讨论】:

【参考方案1】:

您需要在for 循环中使用validateif 之后重置ij

【讨论】:

现在无限循环正在运行。我不知道在哪里。请帮助 total 为 0 时有多少个单元格为 1?这告诉您total 将在所有单元格为 1 时是什么? 好吧,当总计为零时,只有 1 个单元格的值为 1 所以我需要将总数更改为 1 或将基本情况更改为 total==63

以上是关于我正在使用回溯解决骑士之旅问题,但我没有得到想要的结果的主要内容,如果未能解决你的问题,请参考以下文章

骑士之旅 - 导致无限循环,我不知道为啥

骑士之旅(回溯)

c ++中的递归回溯骑士之旅

平行骑士之旅算法

骑士之旅中的堆栈实现[关闭]

骑士之旅蛮力