骑士巡游问题 python
来源:互联网 发布:方维股票配资网站源码 编辑:程序博客网 时间:2024/04/28 09:17
# -*- coding: utf-8 -*-import numpy as npdef printP(): global n global pieces for i in range(n): for j in range(n): print "%d\t"%pieces[i][j], print ""def init(): ''' 初始化棋盘 ''' global n global pieces global point #用于记录剩余的点 pieces = [([0]*100)for j in range(100)] pieces = np.array(pieces) point = [] for i in range(n): for j in range(n): point.append((i,j))def checkXY(x,y): ''' 检查点(x,y)是否在棋盘上 ''' global n if x>=0 and x<n and y>=0 and y<n: return True return False def out1(x,y): ''' 找出所有方向(包括已经被走过的点) ''' global n global pieces global direction outLine1 = [] for i in range(8): x1 = x+direction[i][0] y1 = y+direction[i][1] if checkXY(x1,y1): outLine1.append((x1,y1)) return outLine1def out(x,y): ''' 找出所有可能走的路径 ''' outLine1 = out1(x,y) outLine = [] for item in outLine1: if pieces[item[0]][item[1]]==0: outLine.append(item) return outLinedef check1(): ''' 剪枝1: 判断初始点各个方向上的点是否已经全走过 ''' global point global direction global x0 global y0 for i in range(8): x1 = x0+direction[i][0] y1 = y0+direction[i][1] if checkXY(x1,y1): if (x1,y1) in point: return True return Falsedef check2(x,y): ''' 判断剩余点中是否存在孤立点 ''' global point for p in point: if p[0]==x and p[1]==y: continue if len(out(p[0],p[1]))<1: return True return True def play(x,y,k): global n global x0,y0 global succ global point pieces[x][y] = k point.remove((x,y)) if k==n*n:#找到一条巡游路径 if (x0,y0) in out1(x,y):#判断能否回到初始点 succ = True return k += 1 outLine = out(x,y) l = len(outLine) if l == 0:#该点没有出路回溯 return else: outDic=dict() for item in outLine: outDic[item] = len(out(item[0],item[1])) #按出路从小到达排序 outDic = sorted(outDic.iteritems(),key=lambda d:d[1], reverse = False) for item in outDic: if check1()==False: continue if check2(x,y)==False: continue play(item[0][0],item[0][1],k) if succ:#如果已经找到则跳出循环 break pieces[item[0][0],item[0][1]]=0#还原步骤,继续搜索 point.append((item[0][0],item[0][1])) return#搜索不到则回溯if __name__=="__main__": pieces = []#记录巡游顺序 point = []#记录剩余的点 direction = [(2,1),(2,-1),(-2,1),(-2,-1),(1,2),(1,-2),(-1,2),(-1,-2)]#八个方向 succ = False n = 8 #棋盘维n*n维 #起始点 x0 = 1 y0 = 1 ''' #控制台输入 while checkXY(x0,y0)==False: print "左上角坐标为(0,0)" n = int(raw_input("n:").strip()) x0 = int(raw_input("x0:").strip()) y0 = int(raw_input("y0:").strip()) ''' print "n:",n print "起始点:(%d,%d)\n"%(x0,y0) init()#初始化 play(x0,y0,1)#开始巡游 if succ: print "找到一条巡游路径" printP() else: print "不存在巡游路径"
1 0
- 骑士巡游问题 python
- 骑士巡游问题算法
- 骑士巡游问题
- 骑士巡游问题
- 骑士巡游问题
- 骑士巡游问题的解法
- 骑士巡游
- 骑士巡游问题源码C语言描述
- 用java解决骑士巡游问题
- 骑士巡游问题的warnsdorff规则
- 【搜索】骑士巡游问题,简称746弯
- 骑士巡游问题的C++代码
- 骑士巡游问题:常规解法与启发式方法优化
- 程序设计大赛---骑士巡游
- 骑士巡游 马踏棋盘
- HOJ 1440 骑士巡游 BFS DFS
- caioj1039:递归9(骑士巡游)
- 2009 英特尔® 线程挑战赛 第八题 骑士巡游
- 针对第三方SDK中不恰当的char *类型的几点看法
- java jpg图片 Base64字符串互转
- 网易有道2017内推编程题
- 【CSS】选择器--声明和嵌套
- 对于Java监听器的理解
- 骑士巡游问题 python
- eclipse.ini配置推荐(8/16GB)、Java堆内存详解
- SAP HANA DB: XS Administration Tools Not Accessible
- 定时器
- 小程序wx:for、wx:for-items和wx:for-item的正确用法
- Java访问权限修饰符详解
- Android 6.0运行时权限
- 求解一个有趣的常微分方程组
- Android图片选择器、多选框架