蓝桥杯大胖子走迷宫 BFS

这个题目很容易超时,要注意以下几个点:

①check最好不要使用多次,因为check本身是很费时间的,在bfs里面多次运用容易超时

②起点不需要check,因为起点3×3内肯定无障碍,不然胖子都装不下了

③有一次90%通过率,另外一个运行超时,找了很久原因,后面把这两行代码改成一行就行: x,y,state,time = q[0] q.pop(0)

可以直接改成我代码中的即可: x,y,state,time =q.pop(0) 这样就会省下时间就不会运行超时了

n,k = map(int,input().split())
maps = [list(input()) for _ in range(n)]
walked = [[0]*n for _ in range(n)] #走过的路变成1
walked[2][2] = 1 # 起点
q = [(2,2,5,0)] # 队列:x,y,state,time  state有5,3,1

def next_state(time): 
    "根据步数查看胖子大小"
    if time < k:
        return 5
    elif time < 2*k:
        return 3
    else:
        return 1

def check(x,y,state): 
    "检查[x,y]在state范围内是否障碍"
    change = state//2 # 变动的值,比如[2,2]的时候如果查5×5的范围,那就是5//2=2,[0,4]
    for i in range(x-change,x+change+1): #范围从[x-change,x+change] [0,4]
        for j in range(y-change,y+change+1): # 搜索state范围内
            if 0<=i<=n-1 and 0<=j<=n-1: #如果不超过范围
                if maps[i][j] == "*": #存在障碍
                    return False
            else:
                return False
    return True

def bfs():
    "bfs寻找最短路径"
    while q:
        x,y,state,time = q.pop(0) # 取出第一个值并删除
        for dx,dy in [1,0],[0,1],[-1,0],[0,-1]: # 四个方向走
            nx = x + dx
            ny = y + dy
            if check(nx,ny,state) and walked[nx][ny] == 0: #下一步能走且没走过
                if nx == n-3 and ny == n-3: # 9的话 起点[2,2]  终点[6,6]
                    return time+1 # 下一步是终点就直接返回时间+1
                q.append((nx,ny,next_state(time+1),time+1)) # 新信息加入队列
                walked[nx][ny] = 1 # 走过的路变成1
        if state != 1: # 不是瘦子的话就存在不走的情况,瘦子就肯定会走,上下左右总有一个能走
            q.append((x,y,next_state(time+1),time+1))
    return -1
print(bfs())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值