马走日字--回溯法

摘要:
x+1),(x-2,self.row=nself.column=mself.startx=xself.starty=yself.chessboard=[[0]*self.columnforrinrange(self.row+1)]self.sunx=[1,-2]self.suny=[2,-1]self.chessbboard[self.startx][self.starty]=1;

   马走日字问题,在n*m的棋盘中,马只能走"日"字。马从位置(x,y)出发,把棋盘的每一格都走一次且只走一次。找出所有路径。 

  这个问题可以用回溯法解,每一步都有八种可能的走法,设马当前在(x,y)点,则它的可能走到:

  (x+1,x+2),(x+1,x-2),(x-1,x+2),(x-1,x-2),(x+2,x+1),(x+2,x-1),(x-2,x+1),(x-2,x-1)

  对每一种可能的走法试一遍,如果出界了或者已经走过了,则不用走了。试探一遍后,回溯。

  python实现:

'''
horse rides sun problem
use backtracking algorithm
author:ztp
create at:2015/1/19 15:06
'''

class HorseRides:
    def __init__(self, n, m, x, y):
        self.row = n
        self.column = m
        self.startx = x
        self.starty = y
        self.chessboard = [[0]*self.column for r in range(self.row+1)]
        self.sunx = [1, 1, 2, 2,-1,-1,-2,-2]
        self.suny = [2,-2, 1,-1, 2,-2, 1,-1]
        self.chessboard[self.startx][self.starty] = 1;
        self.count = 0;
    def check(self, x, y):
        if x >= self.row or y >= self.column or x < 0 or y < 0 or self.chessboard[x][y] != 0:
            return 0;
        return 1;
    def ride(self, x, y, step):
        for i in range(8):
            xx = x + self.sunx[i]
            yy = y + self.suny[i]
            if self.check(xx, yy) == 1:
                self.chessboard[xx][yy] = step;
                if step == self.row*self.column:
                    self.output();
                else:
                    self.ride(xx, yy, step+1)
                self.chessboard[xx][yy] = 0
    def output(self):
        self.count = self.count + 1
        print "count = %d" % self.count
        for i in range(self.row):
            print self.chessboard[i]
    def getCount(self):
        return self.count


if __name__ == "__main__":
    horseride = HorseRides(5,4,0,0)
    horseride.ride(0, 0, 2)
    print "total path: %d" % horseride.getCount()

  

免责声明:文章转载自《马走日字--回溯法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Django学习笔记之安全[Android Studio] Android Studio中查看类的继承关系下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

将日期转换为指定的格式:比如转换成 年月日时分秒 这种格式:yyyy-MM-dd hh:mm:ss 或者 yyyy-MM-dd。总结下。

可以为Date原型添加如下的方法: Date.prototype.format = function(fmt) { var o = { "M+" : this.getMonth()+1, //月份 "d+" : this.getDate(),...

html5实现web app摇一摇换歌

微信可以摇歌曲,根据声音识别出歌曲,然后返回歌曲信息,利用html5的deviceOrientation特性和deviceMotion事件也可以在web app上实现类似于微信摇一摇的功能,原生的app实现也有相关接口,这里只考虑web app的情况...... Section One 先来看下demo效果图: 测试地址:http://hcy2367...

redis产生随机数据

  由于需要研究redis cluster集群监控,需要产生随机数据,顾写此set和list随机数据生成代码。 直接贴代码 # coding: utf-8 # author Elephanyu from abc import abstractmethod from random import randint, choice from redisclust...

一个美丽的java烟花程序

<img src="http://img.blog.csdn.net/20150625104525974?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzkxMDM1Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gra...

CCF-201512-3-画图

问题描述 试题编号: 201512-3 试题名称: 画图 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   用 ASCII 字符来画图是一件有趣的事情,并形成了一门被称为 ASCII Art 的艺术。例如,下图是用 ASCII 字符画出来的 CSPRO 字样。   ..____.___...

python:将excel转换xml(testlink)

最近公司内部开始推行使用testlink,打算使用excel编写转换为xml,自行上传,但是最终转换出来的文件还是不能被testlink所识别 最终解决方案:使用testlink convert进行相应的转换操作。 此处仅提供excel转xml的思路:使用xlrd读取excel并存为字典,再从字典解析成xml(一个是用xmldom解析,一种是通过拼接字符串...