ARC#005 C - 器物損壊!高橋君 ( Search and destroy )
器物損壊!高橋君 ( Search and destroy )
道への移動は距離0、壁への移動は距離2と考えて、幅優先探索。
# coding: utf-8 H,W = [int(x)+6 for x in raw_input().split()] c = ["#"*W]*3+["###"+raw_input()+"###" for y in range(H-6)]+["#"*W]*3 D = [[9]*W for y in range(H)] # 家からの壁の破壊回数 Q = [[],[],[]] # 壁の破壊回数i回の地点 for y in range(H): for x in range(W): if c[y][x]=="s": D[y][x] = 0 Q[0] += [(x,y)] for q in Q: while len(q)>0: x,y = q.pop() for dx,dy in [(1,0),(-1,0),(0,1),(0,-1)]: tx,ty = x+dx,y+dy d = D[y][x]+1 if c[ty][tx]=="#" else D[y][x] if d<=2 and d<D[ty][tx]: D[ty][tx] = d Q[d] += [(tx,ty)] for y in range(H): for x in range(W): if c[y][x]=="g": print "YES" if D[y][x]<=2 else "NO"