即使没有进入无限循环,这段代码似乎也永远无法解决

Posted

技术标签:

【中文标题】即使没有进入无限循环,这段代码似乎也永远无法解决【英文标题】:This code seems to never reach the solution even though it doesn't go into an infinite loop 【发布时间】:2019-08-06 08:06:00 【问题描述】:

我想解决 Knight's Tour 并想出了以下程序。即使它似乎没有在任何地方陷入无限循环,它也永远不会给出解决方案(即使给定 2 小时的时间)。

我用 4x4 板(填充一个空格)进行了尝试,因为我知道解决方案,并且代码给出了正确的解决方案,没有任何问题。

from __future__ import print_function

实现回溯算法的递归函数:

def moveKnight(boolBoard, i, j, moveNo, previousMoves):
        if moveNo == 63:
            previousMoves.pop(0)
            print('Success! The moves of the brave Knight are:')
            for i in previousMoves:
                print(i, end = '\t')
            return True
        possMoves = possibleMoves(boolBoard, i, j)
        for nextMove in possMoves:
            previousMoves.append(nextMove)
            boolBoard[nextMove[0]][nextMove[1]] = False
            if moveKnight(boolBoard, nextMove[0], nextMove[1], moveNo+1, previousMoves):
                return True
            previousMoves.remove(nextMove)
            boolBoard[nextMove[0]][nextMove[1]] = True
        return False

根据马的位置和棋盘找出马的所有可能动作的功能:

def possibleMoves(boolBoard, posr, posc):

        possMoves = [[]]
        if posr + 2 < 8 and posc + 1 < 8:
            if boolBoard[posr+2][posc+1]:
                possMoves.append([posr+2, posc+1])
        if posr+2 < 8 and posc - 1 >= 0:
            if boolBoard[posr+2][posc-1]:
                possMoves.append([posr+2, posc-1])
        if posr+1 < 8 and posc + 2 < 8:
            if boolBoard[posr+1][posc+2]:
                possMoves.append([posr+1, posc+2])
        if posr-1 >= 0 and posc+2 < 8:
            if boolBoard[posr-1][posc+2]:
                possMoves.append([posr-1, posc+2])
        if posr-2>=0 and posc + 1 < 8:
            if boolBoard[posr-2][posc+1]:
                possMoves.append([posr-2, posc+1])
        if posr - 2 >= 0 and posc - 1 >= 0:
            if boolBoard[posr-2][posc-1]:
                possMoves.append([posr-2, posc-1])
        if posr - 1 >= 0 and posc - 2 >= 0:
            if boolBoard[posr-1][posc-2]:
                possMoves.append([posr-1, posc-2])
        if posr + 1 < 8 and posc - 2 >= 0:
            if boolBoard[posr+1][posc-2]:
                possMoves.append([posr+1, posc-2])
        possMoves.pop(0)
        return possMoves

主要功能:

if __name__ == '__main__':

        boolBoard = [[True]*8]*8
        for i in range(0, 8):
            boolBoard[i] = [True, True, True, True, True, True, True, True]
        previousMoves = [[]]
        boolBoard[0][0] = False
        if not moveKnight(boolBoard, 0, 0, 0, previousMoves):
            print('Not Possible Bro...')

【问题讨论】:

计数到 moveNo 到 63 的逻辑是什么 在你的代码中添加一些跟踪,这样你就可以检查它在执行过程中做了什么。 @VikrantPawar 当骑士在船上时,我从 moveNo = 0 开始[0][0]。因此,我认为在最后一步中,moveNo 将是 63 【参考方案1】:

我尝试在我的笔记本电脑上运行你的代码(不是很强大的配置)以适应不同的棋盘尺寸:

5x5:2000 次可能的游览 (0.11s) 6x6:700 万次可能的游览(29 秒) 8x8:19,000,000 亿次可能的旅行(预计执行时间:25 亿年)

您的代码看起来很有魅力,但只是尝试的可能性太多

希望对您有所帮助。

【讨论】:

【参考方案2】:

我使用了你程序的修改版本,它适用于 8x8 ,从位置 0,4 开始(因为我知道有有效的解决方案),大约需要 2 分钟。

以下是我所做的更改

    将移动编号初始化为 2,因为第一步是通过设置第一件来完成的 将 MoveNo 检查增加到 65 我还修改了序列以检查可能的值,从 col+2、row+1 开始并顺时针进行

【讨论】:

以上是关于即使没有进入无限循环,这段代码似乎也永远无法解决的主要内容,如果未能解决你的问题,请参考以下文章

为啥这段代码会进入无限循环? [复制]

我在 Python 中编写了一个代码,即使我使用了 break 语句并继续,它仍然会进入 Python 中的无限循环:

React hook useEffect 永远/无限循环连续运行

从 api 获取时反应 useEffect 无限循环

lldb - 如何杀死卡在无限循环中的命令

递归无限循环?