python解决坐标系两点之间有多少种走法问题

python解决坐标系两点之间有多少种走法问题_第1张图片

 

问题:在坐标系中第一象限内的点P(x,y)     x<6,y<6.  到终点(5,5)有多少种走法?并显示出现所经过的点坐标

限制条件:从起点坐标只能向上或者向右走。其中(4,3)是被断开的点。

MAXCOUNT =5 # 设置坐标系中出口的坐标位置M(5,5),计算A(x,y)到M点有多少种走法,要求只能向上或者向右走。

#path函数计算每个坐标点到终点的走法数量,并保存每个坐标到终点的所有经过点的坐标。
def path(x, y):
   
    # 初始化断点,如第四行第三列被阻断 path(4,3)=0,如阻断多个点,则增加若干if语句并返回(0,[])
    if x == 4 and y == 3:
        return (0,[])
    if x == MAXCOUNT and y == MAXCOUNT:  # 默认第5行第5列为出口,通,标记为1,path(5,5)=1
        return (1,[(x,y)])
    if x > MAXCOUNT or y > MAXCOUNT:  # 坐标(x,y)超过了5,则表示不通,标记为0,path(x,y)=0
        return (0,[])
  
    # path(x,y)=path(x+1,y)+path(x,y+1)    坐标(X,Y)到(5,5)之间的路径公式,类似斐波拉契数列。
    (m,a )= path(x+1, y)
    (n,b) = path(x, y+1)
 
    return (m+n,[(x,y)]+a+b)

#以上函数,分析从起点到终点走过的路径组合,但路径的记录是不完整的,需要后期重新补充完整。


#定义startx,starty表示从某个起点A的坐标,到终点(MAXCOUNT,MAXCOUNT)的路径需要程序中完整记录下来
testpoint = [(3, 3), (3, 2),(0,0)]
for (startx,starty) in testpoint:
    #获取起点坐标(startx,starty)到终点的所有走法为x,所经过的每个点坐标集合为listpath
    (x, listpath) = path(startx, starty)

    #在listpath中找出终点的坐标,每找到一个终点,表示成功1次。在将成功的路径坐标保存到truelist中
    truelist = []
    tmp = []
    count = 0
    OVERPOINT = (MAXCOUNT, MAXCOUNT)  # 终点
    #将listpath ----->truelist(以终点为目标得到truelist)
    for m in listpath:
        tmp.append(m)
        if m == OVERPOINT:
            truelist.append(tmp)
            count = count+1
            tmp = []
    print('从(%d,%d)到终点(%d,%d)的所有路径数量:' %
          (startx, starty, MAXCOUNT, MAXCOUNT), x)
   
    #print('-----路径列表------------------')
    if (len(truelist)>0):
        pre=len(truelist[0])
        print(truelist[0])
        for m in range(1,len(truelist)):
            current=len(truelist[m])
            addtemp=[]
            for n in range(0,pre-current):
                addtemp.append(truelist[m-1][n])
            truelist[m]=addtemp+truelist[m]
            pre=len(truelist[m])
            print(truelist[m])
    print('\n')

你可能感兴趣的:(python)