728x90
from collections import deque
dx = [-1,0,0,1]
dy = [0,-1,1,0]
def check_can_move(endXX,endYY,visited):
if endXX < 0 or endXX >= n or endYY < 0 or endYY >= n or visited[endXX][endYY] == 1 or maps[endXX][endYY] == -1 or maps[endXX][endYY] == -2:
# 격자 밖 or 이미 들린곳 or 점령된 BC or 점령된 fac
return False
return True
def find_route(startX,startY,routeCount,facX,facY):
for i in range(4):
visited = [[0 for _ in range(n)] for _ in range(n)]
visited[startX][startY] = 1
endX = startX + dx[i]
endY = startY + dy[i]
if endX == facX and endY == facY:
routeCount.append([-1, i])
break
if not check_can_move(endX,endY,visited):
continue
stack = deque()
stack.append([endX, endY,0])
while len(stack) != 0:
startXX,startYY,tCount = stack.popleft()
visited[startXX][startYY] = 1
for j in range(4):
endXX = startXX+dx[j]
endYY = startYY+dy[j]
if not check_can_move(endXX,endYY,visited):
continue
if endXX== facX and endYY == facY: #도달한경우
routeCount.append([tCount,i])
stack.clear()
break
else:
stack.append([endXX,endYY,tCount+1])
def move_all_1():
for i in range(len(player)):
startX,startY,facX,facY,m = player[i]
routeCount = [] #[count,rank]
find_route(startX,startY,routeCount,facX,facY)
# print(routeCount)
routeCount.sort(key=lambda x: (x[0],x[1]))
short_dir = routeCount[0][1]
endX = startX+dx[short_dir]
endY = startY+dy[short_dir]
player[i][0] = endX
player[i][1] = endY
def check_end():
for i in range(len(player)-1,-1,-1):
if player[i][0] == player[i][2] and player[i][1] == player[i][3]:#편의점 도착
maps[player[i][0]][player[i][1]] = -2 # 도착한 편의점 못지나감
player.pop(i)
def go_BC(t):
facX,facY = fac[t-1]
stack = deque()
stack.append([facX,facY])
visited = [[0 for _ in range(n)] for _ in range(n)]
while len(stack) != 0:
# print(stack)
startX,startY = stack.popleft()
visited[startX][startY] = 1
for j in range(4):
endX = startX+dx[j]
endY = startY+dy[j]
if not check_can_move(endX,endY,visited):
continue
if maps[endX][endY] == 1 or maps[endX][endY] == -1: #갈 수 있는 곳인데 거기에 BC있으면?
maps[endX][endY] = -1
player.append([endX,endY,facX,facY,t-1])
stack.clear()
break
else:
stack.append([endX,endY])
n,m = map(int,input().split())
maps = []
for _ in range(n):
maps.append(list(map(int,input().split())))
fac = []
for _ in range(m):
tempList = list(map(int,input().split()))
tempList[0] -= 1
tempList[1] -= 1
fac.append(tempList)
player = [1]
times = 0
check = True
while len(player) != 0:
#print(player)
if times == 0:
player.clear()
times+=1
move_all_1()
check_end()
if times <= m:
go_BC(times)
print(times)
문제에서 말한 순서 1,2,3을 순차적으로 따르는것이 이 문제의 주요 포인트인듯 하다.
생각할 것들
1. 베이스캠프 찾기 : 매분마다 map이 변할 수 있기 때문에 추가할때의 map상황에서 최소 거리를 찾아야 한다.
2. player 이동 : 매분마다 map이 변할 수 있기 때문에 이동할 때마다 편의점까지의 최소거리를 계산해서 움직여야 한다.
이동의 우선순위는 상,좌,우,하 이므로 dx,dy를 이에 맞게 초기화해 사용해야 한다.
728x90
'IT 일기 > 코테' 카테고리의 다른 글
이상한 체스 - python (0) | 2023.04.08 |
---|---|
정육면체 한번 더 굴리기 - python (0) | 2023.04.08 |
17070 / 파이프 옮기기 1 파이썬 (0) | 2023.04.07 |
16637번 / 괄호 추가하기 - 파이썬 (0) | 2023.04.06 |
배열 돌리기 4 - 파이썬 (0) | 2023.04.06 |