Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
回老家跟侄子玩,因为不想惯着他玩手机的臭毛病,就跟他玩一些纸笔游戏,比如这个:
从起点出发抵达终点,如何在不走重复格子的前提下,走过尽可能多的格子,并吃到尽可能多的金币?其中,黑色格子是墙壁不能走。
感觉还挺有意思的,不妨就来写一个“一笔画”的求解器,找出所有最优的轨迹。
思路:
可以先输出所有从起点到终点的轨迹,然后建立一个评分系统对所有轨迹进行评估:每走一个格子+1分,每吃一个金币+1分,最后输出评分最高的轨迹即可。
Step1:建模
一个如图的迷宫可以很自然地用矩阵描述,对于每一个元素,值0表示空格子,值1表示金币,值-1表示墙壁,值2表示起点,值3表示终点。
import numpy as np
ROW, COL = 6, 4
maze = np.zeros((ROW,COL))
START = (0, 3)
OUT = (5, 0)
maze[START] = 2
maze[OUT] = 3
maze[1, 1] = 1
maze[5, 3] = 1
maze[2, 1] = -1
maze[4, 2] = -1
View Code
Step2:寻迹算法
一条轨迹可以拆分成多个“步”,在走每一步之前,所做的事情是一样的:找到下一步能到达的合法位置,然后选择其中一个。如果新位置是死路或者是终点,那么结束或输出该轨迹,并返回到上一步所在的位置,选择其他步。这一过程可以很好地由递归函数表达:
def step(start, track, env):
x, y = start
next\_pos = []
for i, j in [(x-1, y), (x+1, y), (x, y-1), (x, y+1)]:
if 0 <= i <= ROW-1 and 0 <= j <= COL-1: # 边界限制
if (i, j) in track: # 重复的格子不能走
continue
if env[i,j] == -1: # 有墙壁的格子不能走
continue
next\_pos.append((i, j))
for i, j in next\_pos: # 如果next\_pos为空,不会进入循环,所以无需专门处理边界情况
track\_new = track.copy()
track\_new.append((i, j))
if (i, j) == OUT:
global tracks
tracks.append(track\_new)
return
start\_new = (i, j)
step(start\_new, track\_new, env)
<