""" 跳马问题算法 """ from sprites import * grid_width = 50 # 格子宽度 grid_height = 40 # 格子高度 rows = 4 # 表示行数 cols = 8 # 表示列数 chess_width = grid_width * cols chess_height = grid_height * rows screen = Screen() # 新建屏幕 screen.setup(600,480) screen.title('跳马问题算法答案演示by李兴球') s = Sprite(visible=False) s.draw_grid2(rows,cols,grid_width,grid_height) left,bottom = -chess_width/2,-chess_height/2 cors = [] # 每个顶点的坐标 for r in range(rows+1): rcors = [] for c in range(cols+1): x = left + c * grid_width y = bottom + r * grid_height rcors.append((x,y)) cors.append(rcors) jack = Sprite(visible=False) ft = ('黑体',20,'bold') jack.addy(150) jack.write("跳马问题算法答案演示",align='center',font=ft) tom = Sprite(shape='res/马.png') def output(points): tom.clear() tom.show() for p in points: i,j = p pos = cors[j][i] tom.goto(pos) tom.pendown() tom.dot(10,'magenta') tom.wait(0.1) tom.penup() tom.stamp() tom.hide() tom.goto(0,-150) tom.write(str(points),align='center') tom.wait(1) grids = [ ] for r in range(rows+1): grids.append([0 for i in range(cols+1)]) def outofrange(a,b): """是否超出范围""" return a > cols or b > rows or a <0 or b<0 x = 0 y = 0 points = [(0,0)] # 记录路径的 grids[0][0] = 1 # 标记第一个点 condition = [(1,2),(2,1),(2,-1),(1,-2)] # 4个试探运算 records = {(0,0):-1} # 记录当前点已经试探过的运算 running = True while running: # 开始试探 if (x,y) in records: # 如果有此键说明在此点试探过 start = records[(x,y)] if start == 3 : # 此点全部试完了,则回溯 x,y = points.pop() grids[y][x] = 0 # 把此点标记为0 records[(x,y)] = -1 # 记录此点以后需要全部测试4个方向 if points == []: running = False else: x,y = points[-1] # 从这个点重新开始 else: start = -1 for index in range(start+1,4): records[(x,y)] = index # 记录此点的运算已经试探过了 dx,dy = condition[index] nextx = x + dx nexty = y + dy if outofrange(nextx,nexty):continue elif nextx < cols and nexty <= rows: grids[nexty][nextx] = 1 points.append((nextx,nexty)) x = nextx y = nexty break elif nextx == cols: grids[nexty][nextx] = 1 points.append((nextx,nexty)) if nexty == rows: output(points) # 到达了右上角,可输出这个路径了 # 回溯到上一个点 x,y = points.pop() grids[y][x] = 0 records[(x,y)] = -1 if points == []: running = False else: x,y = points[-1]
李兴球
李兴球的博客是Python创意编程原创博客