时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 小明在玩一个电脑游戏,游戏在一个n×m的方格图上进行,小明控制的角色开始的时候站在第一行第一列,目标是前往第n行第m列。 输入格式 输入的第一行包含三个整数n, m, t,用一个空格分隔,表示方格图的行数n、列数m,以及方格图中有危险的方格数量。 输出格式 输出一个整数,表示小明最快经过几个时间单位可以过关。输入数据保证小明一定可以过关。 样例输入 3 3 3 样例输出 6 样例说明 第2行第1列时刻1是危险的,因此第一步必须走到第1行第2列。 评测用例规模与约定 前30%的评测用例满足:0 < n, m ≤ 10,0 ≤ t < 99。 |
类似于三维bfs做的,py超时,连50没有。。。C就能过。。。
from queue import Queue
class node:
def __init__(self,x,y,t):
self.x=x
self.y=y
self.t=t
def cmp(x,y):
if x>0 and x<=n and y>0 and y<=m:
return True
return False
def bfs(stx,sty,time):
global vis
que =Queue()
que.put(node(stx,sty,time))
vis[stx][sty][time]=1
#print(1)
while not que.empty():
#print(2)
tmp = que.get()
#print(2)
if tmp.x==n and tmp.y==m:
print(tmp.t)
break
for i in range(4):
tx=tmp.x+dir[i][0]
ty=tmp.y+dir[i][1]
tt = tmp.t+1
if cmp(tx,ty) and (tt<dast[tx][ty] or tt>daed[tx][ty]) and vis[tx][ty][tt]==0:
vis[tx][ty][tt]=1
que.put(node(tx,ty,tt))
#print(3)
while True:
try:
dir =[[0,1],[0,-1],[1,0],[-1,0]]
vis = [[[0 for _ in range(300)] for _ in range(105)]for _ in range(105)]
dast=[[0 for _ in range(105)]for _ in range(105)]
daed=[[0 for _ in range(105)]for _ in range(105)]
n,m,t = map(int,input().split())
for i in range(t):
r,c,a,b = map(int,input().split())
dast[r][c]=a
daed[r][c]=b
bfs(1,1,0)
except:
break