【面试题】醉汉岛上行走问题

题目:有一个正方形的岛,用二维方形矩阵表示。岛上有一个醉汉,每一步可以往上下左右四个方向之一移动一个。如果超出矩阵他就死了。假设每一步方向的选择是随机的,请计算n步后他还活着的概率。

例如:

输入矩阵大小2X2,起点(0,0),n=1 输出0.5

输入矩阵大小3X3,起点(1,1),n=1 输出1

输入矩阵大小3X3,起点(0,0),n=1 输出0.375

解题的思路:(先放上文字版的,等之后忙完了再放上图解)

利用广度优先的算法穷举了所有可能的路径,并将可存活的点压入队列中。其中只要发现坐标超过表盘的要求则直接舍弃。
因此队列中最后留下的最后成功路径最后的落脚点。只需要计算最后成功的次数。
所有的次数=4**N
概率=成功的次数/所有的次数

题目中"只要一出去就死的意思":其实转化为遍历的判断条件:在任意过程中坐标(x,y)中的xy值都必须要>0且小于N
避免的情况比如:
醉汉从(0,0)→(-1,0)→(0,0)的情况。

import collections
def how_likely_alive(m, n, i, j,N): #m,n大小,ij起步位置,N步数
    Deque1 = collections.deque([])
    Deque1.append((i,j,0))
    while(True):
        x, y, step = Deque1.popleft()
        if step==N:break
        if x-1&g
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值