深度優(yōu)先搜索DFS

騎士周游問題

取一塊國(guó)際象棋棋盤和一顆騎士棋子(馬)。目標(biāo)是找到一系列走法坎缭,使得騎士對(duì)棋
盤上的每一格剛好都只訪問一次。這樣的一個(gè)移動(dòng)序列被稱為“周游路徑”

1.構(gòu)建騎士周游圖

from myGraph import Graph


def knightGraph(bdsize):
    g = Graph()
    for row in range(bdsize):
        for col in range(bdsize):
            nodeId = posToNodeId(row, col, bdsize)
            newPositions = genLegalMoves(row, col, bdsize)
            for i in newPositions:
                newid = posToNodeId(i[0], i[1], bdsize)
                g.addEdge(nodeId, newid)
    return g

def genLegalMoves(row, col, bdsize):
    newmoves = []
    moveOffsets = [(-1, -2), (-1, 2), (-2, -1), (-2, 1), (1, -2), (1, 2), (2, -1), (2, 1)]
    for i in moveOffsets:
        newrow = row + i[0]
        newcol = col + i[1]
        if legalCoord(newrow, bdsize) and legalCoord(newcol, bdsize):
            newmoves.append((newrow, newcol))
    return newmoves


def legalCoord(x, bdsize):
    if x >= 0 and x < bdsize:
        return True
    else:
        return False


def posToNodeId(row, col, bdsize):
    return row * bdsize + col

2.實(shí)現(xiàn)騎士周游

def knightTour(n, path, u, limit):
    u.setColor('Gray')
    path.append(u)
    done = False
    if n < limit:
        nbrList = list(orderByAvail(u))
        i = 0
        while i < len(nbrList) and not done:
            if nbrList[i].color == 'White':
                done = knightTour(n+1, path, nbrList[i], limit)
            i += 1
        if not done:
            path.pop()
            u.setColor('White')

    else:
        done = True
    return done

def orderByAvail(n):
    resList = []
    for v in n.getConnections():
        if v.getColor() == 'White':
            c = 0
            for w in v.getConnections():
                if w.getColor() == 'White':
                    c += 1
            resList.append((c, v))
    resList.sort(key=lambda x: x[0])
    return [y[1] for y in resList]


if __name__ == '__main__':
    g = knightGraph(8)
    path = []
    startVertex = g.getVertex(4)
    knightTour(0, path, startVertex, 63)
    for i in path:
        print(i.getId(), end=' ')

輸出:

4 14 31 46 63 53 47 62 52 58 48 33 16 1 11 5 15 21 6 23 38 55 61 51 57 40 50 56 41 24 9 3 13 7 22 39 54 60 45 30 36 26 20 37 43 28 18 8 2 12 29 35 25 19 34 44 59 49 32 42 27 17 0 10
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末签钩,一起剝皮案震驚了整個(gè)濱河市掏呼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铅檩,老刑警劉巖憎夷,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異柠并,居然都是意外死亡岭接,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門臼予,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鸣戴,“玉大人,你說我怎么就攤上這事粘拾≌” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵缰雇,是天一觀的道長(zhǎng)入偷。 經(jīng)常有香客問我,道長(zhǎng)械哟,這世上最難降的妖魔是什么疏之? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮暇咆,結(jié)果婚禮上锋爪,老公的妹妹穿的比我還像新娘丙曙。我一直安慰自己,他們只是感情好其骄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布亏镰。 她就那樣靜靜地躺著,像睡著了一般拯爽。 火紅的嫁衣襯著肌膚如雪索抓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天毯炮,我揣著相機(jī)與錄音逼肯,去河邊找鬼。 笑死否副,一個(gè)胖子當(dāng)著我的面吹牛汉矿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播备禀,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼洲拇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了曲尸?” 一聲冷哼從身側(cè)響起赋续,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎另患,沒想到半個(gè)月后纽乱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昆箕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年鸦列,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹏倘。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡薯嗤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纤泵,到底是詐尸還是另有隱情骆姐,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布捏题,位于F島的核電站玻褪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏公荧。R本人自食惡果不足惜带射,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望循狰。 院中可真熱鬧窟社,春花似錦捻浦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昧识。三九已至钠四,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跪楞,已是汗流浹背缀去。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甸祭,地道東北人缕碎。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像池户,于是被迫代替她去往敵國(guó)和親咏雌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容