美文网首页
图的应用2——骑士周游问题

图的应用2——骑士周游问题

作者: 腹黑君 | 来源:发表于2020-06-20 11:53 被阅读0次

问题描述

按照马走日的规则,要求从一个格子出发,走遍所有棋盘格恰好一次,称为周游

问题思路

按照图解决,通过将棋盘格作为顶点,按照马走日的规则,连边,建立每个棋盘
格的合法走棋步骤

使用方法

深度优先搜索 DFS

代码如下:

# 走棋位置函数
def genLegalMoves(x, y, bdSize):
    newMoves = []
    # 马走日的格子
    moveOffsets = [(-1, -2), (-1, 2), (-2, -1), (-2, 1),
                   (1, -2), (1, 2), (2, -1), (2, 1)]
    for i in moveOffsets:
        newX = x + i[0]
        newY = y + i[1]
        if legalCoord(newX, bdSize) and legalCoord(newY, bdSize):
            newMoves.append((newX, newY))
    return newMoves


# 确认不会走出棋盘
def legalCoord(x, bdSize):
    if 0 <= x <= bdSize:
        return True
    else:
        return False


def knightGraph(bdSize):
    ktGraph = Graph()
    # 对棋盘每个位置遍历
    for row in range(bdSize):
        for col in range(bdSize):
            nodeId = posToNodeID(row, col, bdSize)
            # 寻找下一步走棋位置
            newPositions = genLegalMoves(row, col, bdSize)
            for e in newPositions:
                # 顶点放入图中,并添加相互边
                nid = posToNodeID(e[0], e[1], bdSize)
                ktGraph.addEdge(nodeId, nid)
    return ktGraph


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


# DFS算法, n:层次;path:路径;u:当前顶点;limit:搜索总深度
def knightTour(n, path, u, limit):
    u.setColor('grey')
    # 当前顶点加入路径
    path.append(u)
    if n < limit:
        nbrList = list(u.getConnections())
        i = 0
        done = False
        while i < len(nbrList) and not done:
            # 选择白色未探索过的顶点
            if nbrList[i].getColor() == 'white':
                done = knightTour(n + 1, path, nbrList[i], limit)
                i += 1
        # 无法探索到最深,该路径无用,返回上一顶点
        if not done:
            path.pop()
            u.setColor('white')
    else:
        done = True
    return done

相关文章

  • 图的应用2——骑士周游问题

    问题描述 按照马走日的规则,要求从一个格子出发,走遍所有棋盘格恰好一次,称为周游 问题思路 按照图解决,通过将棋盘...

  • 7.4图的应用:骑士周游问题

    在一个国际象棋棋盘上,一个棋子“马” (骑士),按照“马走日”的规则,从一个格子出发,要走遍所有棋盘格恰好一次。把...

  • 骑士周游回溯算法

    其实周游就是说马在一个棋盘上以走斜日的方式走棋盘,不能走已经走过的,需要将这个棋盘走完,最后一步回归原点,不过我的...

  • iOS不能下载安装或iOS应用点击后立即闪退

    iOS应用安装测试使用过程中总出现问题,特记录下, 1、iOS不能安装,出现图2问题(先出现图1灰色再弹出图2的提...

  • 飞驰人生

    图/蓝骑士

  • 燃烧我的卡路里

    图/蓝骑士

  • 2016年5月24日,略显阴天

    今天詹姆斯的骑士队又输球了,赛前我想骑士队横扫猛龙队应该问题不大吧,结果现在竟然打到2:2平了,虽然我依...

  • 应用 "内存泄漏"排查

    现象:应用启动后,容器内存,jvm内存 持续增加。见图 图1 容器内存使用图 图2 应用启动时jvm堆内存使用图 ...

  • 12.27

    8:30-11:00,分数应用题:1了解分数应用题倍数关系的实际问题。2准确清晰的确定单位1。3采用线段图的方法直...

  • 大连滕泰科技学习笔记2020-06-23

    1,lambda应用案例1 2,lambda应用案例2 3,总结以上问题

网友评论

      本文标题:图的应用2——骑士周游问题

      本文链接:https://www.haomeiwen.com/subject/boywxktx.html