馬的遍歷

##棋盤長寬
X = 15

Y = 15

##相對與初始位置馬能夠選擇走的步數
STEP = 8
##馬能夠選擇走的方式
nextList = [(2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1), (-2, -1), (-1, -2), (1, -2)]

##出發點
startPoint=(0,0)

chess=[[0 for j in range(Y)] for i in range(X)]
print(chess)

##判斷下一步是否可走
def nextOk(point, i):
    nextp = (point[0] + nextList[i][0], point[1] + nextList[i][1])#獲取偏移後坐標
    if 0 <= nextp[0] < X and 0 <= nextp[1] < Y and chess[nextp[0]][nextp[1]] == 0:#判斷落子是否在棋盤內,而且未被走過
        return True, nextp
    else:
        return False, point
##得到下一步可走列表
def findNext(point):
    list = []
    for i in range(STEP):
        ok, pointn = nextOk(point, i) #(2,0),0-7  把能走的座標都放入列表中返回
        if ok:
            list.append(pointn)
    return list

##得到步數最少的下一步(貪婪算法)
def getBestNext(point, step):  #(2,0),2
    # temp =X+1
    temp =8
    best = (-1, -1)

    list = findNext(point)
    lenp = len(list)
    for i in range(lenp):
        n = len(findNext(list[i]))#在第二步的基礎上,找第三步座標可能性的列表長度
        if n < temp:
            if n > 0:
                temp = n
                best = list[i]    #挑步數最少的做爲第二步座標
            elif n == 0 and step == X * Y:
                best = list[i]
    return best
##迭代方式 貪婪算法
def traverseFast(point, step):  #(2,0),1
    chess[point[0]][point[1]] = step  #chess=[[0,0,0],[0,0,0],[1,0,0]
    while 1:
        step += 1
        best = getBestNext(point, step)
        if best[0] == -1:
            return step
        else:
            chess[best[0]][best[1]] = step  #把第二步座標處改成2
            point = best   #起始座標改成第二步座標

def testFast():

    step = traverseFast(startPoint, 1)   #(2,0)    1
    if step - 1 == X * Y:
        print('快速遍歷成功')
    else:
        print('快速遍歷失敗')


if __name__ == '__main__':
     testFast()


'''
總結:
1.初始化棋盤:二維X*Y
2.八種相對初始座標的偏移
3,初始位置的選定
4.找到指定第一步位置,將0改成1
5,用一個死循環,第二步判斷哪些位置可走,獲取偏移後坐標,判斷落子是否在棋盤內,而且未被走過,8種方式,將其第二步座標添加到列表之中,
再從第二步列表中座標做爲初始座標,再走8種偏移獲取第三步座標列表,從中挑取列表長度最短的做爲第二步座標
6.若是列表長度爲0說明,馬的位置已經所有走完,能夠比較其步數是否等於x*y,若是列表長度不爲0能夠繼續迭代



'''
相關文章
相關標籤/搜索