아직 계정이 없으신가요? 회원가입

Dev. Talk

GINI야 도와줘 반례 부탁드립니다.

회원사진ghlrms1010
280 views2021-10-21 02:37


import sys

r,c = map(int, sys.stdin.readline().split())
Map = []
for i in range(r):
    row = list(sys.stdin.readline().strip())
    Map.append(row)
    if 'H' in row:
        h = (i,row.index('H'))
    if '*' in row:
        r_stack = [(i,row.index('*'))]
    if 'W' in row:
        w_stack = [(i,row.index('W'))]

cnt = 0
tmp = []

while True:
    # 소나기 위치이동
    for R in r_stack: 
        for a,b in [[1,0],[-1,0],[0,1],[0,-1]]:
            if 0<= R[0]+a <r and 0<= R[1]+b <c and Map[R[0]+a][R[1]+b] == '.':
                Map[R[0]+a][R[1]+b] = '*'
                tmp.append(((R[0]+a),(R[1]+b)))
    r_stack = list(tmp) # 다음에 움직이기 시작하는 소나기 위치 저장
    tmp = []

    # 사람 위치
    for w in w_stack:
        for a,b in [[1,0],[-1,0],[0,1],[0,-1]]:
            if 0<= w[0]+a <r and 0<= w[1]+b <c and (Map[w[0]+a][w[1]+b] == '.' or Map[w[0]+a][w[1]+b] == 'H'):
                Map[w[0]+a][w[1]+b] = 'W'
                tmp.append(((w[0]+a),(w[1]+b))) 
    w_stack = list(tmp) # 다음에 움직이기 시작하는 사람위치 저장

    # 사람이 움직일 곳이 없으면 종료
    if len(tmp)==0:
        answer = 'FAIL'
        break
    
    tmp =[]
    cnt += 1 # 움직인 횟수 계산

    # 사람이 움직인 곳중 집의 위치가 있으면 종료
    if h in w_stack:
        answer = cnt
        break
print(answer)      

테스트 케이스중 3,5번은 오답 1,6번은 런타임에러가 나오는데 반례를 잘 모르겠습니다.

반례나 실수한 부분 지적 부탁드립니다.