[λ°±μ€/python] 19238λ² : μ€ννΈ νμ
λ¬Έμ
μ€ννΈλ§ν¬κ° "μ€ννΈ νμ"λΌλ μ΄λ¦μ νμ μ¬μ μ μμνλ€. μ€ννΈ νμλ νΉμ΄νκ²λ μλμ λμ°©μ§λ‘ λ°λ €λ€μ€ λλ§λ€ μ°λ£κ° μΆ©μ λκ³ , μ°λ£κ° λ°λ₯λλ©΄ κ·Έ λ μ μ λ¬΄κ° λλλ€.
νμ κΈ°μ¬ μ΅λ°±μ€μ μ€λ Mλͺ μ μΉκ°μ νμ°λ κ²μ΄ λͺ©νμ΄λ€. λ°±μ€μ΄ νλν μμμ N×N ν¬κΈ°μ 격μλ‘ λνλΌ μ μκ³ , κ° μΉΈμ λΉμ΄ μκ±°λ λ²½μ΄ λμ¬ μλ€. νμκ° λΉμΉΈμ μμ λ, μνμ’μ°λ‘ μΈμ ν λΉμΉΈ μ€ νλλ‘ μ΄λν μ μλ€. μκ³ λ¦¬μ¦ κ²½λ ₯μ΄ λ§μ λ°±μ€μ νΉμ μμΉλ‘ μ΄λν λ νμ μ΅λ¨κ²½λ‘λ‘λ§ μ΄λνλ€.
Mλͺ μ μΉκ°μ λΉμΉΈ μ€ νλμ μ μμΌλ©°, λ€λ₯Έ λΉμΉΈ μ€ νλλ‘ μ΄λνλ €κ³ νλ€. μ¬λ¬ μΉκ°μ΄ κ°μ΄ νμΉνλ κ²½μ°λ μλ€. λ°λΌμ λ°±μ€μ ν μΉκ°μ νμ λͺ©μ μ§λ‘ μ΄λμν€λ μΌμ Mλ² λ°λ³΅ν΄μΌ νλ€. κ° μΉκ°μ μ€μ€λ‘ μμ§μ΄μ§ μμΌλ©°, μΆλ°μ§μμλ§ νμμ ν μ μκ³ , λͺ©μ μ§μμλ§ νμμμ λ΄λ¦΄ μ μλ€.
λ°±μ€μ΄ νμΈ μΉκ°μ κ³ λ₯Ό λλ νμ¬ μμΉμμ μ΅λ¨κ±°λ¦¬κ° κ°μ₯ 짧μ μΉκ°μ κ³ λ₯Έλ€. κ·Έλ° μΉκ°μ΄ μ¬λ¬ λͺ μ΄λ©΄ κ·Έμ€ ν λ²νΈκ° κ°μ₯ μμ μΉκ°μ, κ·Έλ° μΉκ°λ μ¬λ¬ λͺ μ΄λ©΄ κ·Έμ€ μ΄ λ²νΈκ° κ°μ₯ μμ μΉκ°μ κ³ λ₯Έλ€. νμμ μΉκ°μ΄ κ°μ μμΉμ μ μμΌλ©΄ κ·Έ μΉκ°κΉμ§μ μ΅λ¨κ±°λ¦¬λ 0μ΄λ€. μ°λ£λ ν μΉΈ μ΄λν λλ§λ€ 1λ§νΌ μλͺ¨λλ€. ν μΉκ°μ λͺ©μ μ§λ‘ μ±κ³΅μ μΌλ‘ μ΄λμν€λ©΄, κ·Έ μΉκ°μ νμ μ΄λνλ©΄μ μλͺ¨ν μ°λ£ μμ λ λ°°κ° μΆ©μ λλ€. μ΄λνλ λμ€μ μ°λ£κ° λ°λ₯λλ©΄ μ΄λμ μ€ν¨νκ³ , κ·Έ λ μ μ λ¬΄κ° λλλ€. μΉκ°μ λͺ©μ μ§λ‘ μ΄λμν¨ λμμ μ°λ£κ° λ°λ₯λλ κ²½μ°λ μ€ν¨ν κ²μΌλ‘ κ°μ£Όνμ§ μλλ€.
λͺ¨λ μΉκ°μ μ±κ³΅μ μΌλ‘ λ°λ €λ€μ€ μ μλμ§ μμλ΄κ³ , λ°λ €λ€μ€ μ μμ κ²½μ° μ΅μ’ μ μΌλ‘ λ¨λ μ°λ£μ μμ μΆλ ₯νλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
첫 μ€μ N, M, κ·Έλ¦¬κ³ μ΄κΈ° μ°λ£μ μμ΄ μ£Όμ΄μ§λ€. (2 ≤ N ≤ 20, 1 ≤ M ≤ N2, 1 ≤ μ΄κΈ° μ°λ£ ≤ 500,000) μ°λ£λ 무νν λ§μ΄ λ΄μ μ μκΈ° λλ¬Έμ, μ΄κΈ° μ°λ£μ μμ λμ΄μ μΆ©μ λ μλ μλ€.
λ€μ μ€λΆν° Nκ°μ μ€μ κ±Έμ³ λ°±μ€μ΄ νλν μμμ μ§λκ° μ£Όμ΄μ§λ€. 0μ λΉμΉΈ, 1μ λ²½μ λνλΈλ€.
λ€μ μ€μλ λ°±μ€μ΄ μ΄μ μ μμνλ μΉΈμ ν λ²νΈμ μ΄ λ²νΈκ° μ£Όμ΄μ§λ€. νκ³Ό μ΄ λ²νΈλ 1 μ΄μ N μ΄νμ μμ°μμ΄κ³ , μ΄μ μ μμνλ μΉΈμ λΉμΉΈμ΄λ€.
κ·Έλ€μ μ€λΆν° Mκ°μ μ€μ κ±Έμ³ κ° μΉκ°μ μΆλ°μ§μ νκ³Ό μ΄ λ²νΈ, κ·Έλ¦¬κ³ λͺ©μ μ§μ νκ³Ό μ΄ λ²νΈκ° μ£Όμ΄μ§λ€. λͺ¨λ μΆλ°μ§μ λͺ©μ μ§λ λΉμΉΈμ΄κ³ , λͺ¨λ μΆλ°μ§λ μλ‘ λ€λ₯΄λ©°, κ° μλμ μΆλ°μ§μ λͺ©μ μ§λ λ€λ₯΄λ€.
μΆλ ₯
λͺ¨λ μλμ μ΄λμν€κ³ μ°λ£λ₯Ό μΆ©μ νμ λ λ¨μ μ°λ£μ μμ μΆλ ₯νλ€. λ¨, μ΄λ λμ€μ μ°λ£κ° λ°λ₯λμ λ€μ μΆλ°μ§λ λͺ©μ μ§λ‘ μ΄λν μ μμΌλ©΄ -1μ μΆλ ₯νλ€. λͺ¨λ μλμ μ΄λμν¬ μ μλ κ²½μ°μλ -1μ μΆλ ₯νλ€.
μ λ΅
import sys
input = sys.stdin.readline
# N, M, μ΄κΈ° μ°λ£ μ μ
λ ₯
N, M, fuel = map(int, input().split())
# νλ μμ μ§λ area μ
λ ₯
area = [[1 for _ in range(N+1)]]
for _ in range(N):
area.append([1])
area[-1].extend(list(map(int, input().split())))
# μ΄μ μ μμνλ μΉΈ now μ
λ ₯
now = tuple(map(int, input().split()))
# μΉκ°μ μΆλ°μ§μ λͺ©μ μ§ μ
λ ₯
passenger = {}
for _ in range(M):
a, b, c, d = map(int, input().split())
passenger[(a, b)] = (c, d)
around = [(0,1), (1,0), (-1,0), (0,-1)]
take_a_taxi = False
while passenger:
arrival, target = tuple(), set()
visited, queue = set(), {now}
move = 0
while queue:
candidate = set()
for x, y in queue:
if (0 <= x < N+1 and 0 <= y < N+1) and area[x][y] == 0:
if take_a_taxi and (x, y) == passenger[now]:
del passenger[now]
arrival = (x, y)
break
elif not take_a_taxi and (x, y) in passenger:
target.add((x, y))
else:
for _x, _y in around:
if (x+_x, y+_y) not in visited:
candidate.add((x+_x, y+_y))
visited.add((x, y))
if arrival:
take_a_taxi = False
now = arrival
fuel = fuel + move if fuel >= move else -1
break
if target:
take_a_taxi = True
now = sorted(target)[0]
fuel -= move
break
if not candidate:
fuel = -1
break
queue = candidate
move += 1
if fuel < 0:
fuel = -1
break
print(fuel)
# N, M, μ΄κΈ° μ°λ£ μ μ
λ ₯
N, M, fuel = map(int, input().split())
# νλ μμ μ§λ area μ
λ ₯
area = [[1 for _ in range(N+1)]]
for _ in range(N):
area.append([1])
area[-1].extend(list(map(int, input().split())))
# μ΄μ μ μμνλ μΉΈ now μ
λ ₯
now = tuple(map(int, input().split()))
# μΉκ°μ μΆλ°μ§μ λͺ©μ μ§ μ
λ ₯
passenger = {}
for _ in range(M):
a, b, c, d = map(int, input().split())
passenger[(a, b)] = (c, d)
around = [(0,1), (1,0), (-1,0), (0,-1)]
take_a_taxi = False
while passenger:
arrival, target = tuple(), set()
visited, queue = set(), {now}
move = 0
while queue:
candidate = set()
μ λ ₯μ λ°κ³ νμν λ³μλ€μ μμ±νλ€.
- area : λ¬Έμ μμ μΈλ±μ€ 1λΆν° μμνλ―λ‘ κ°λ‘, μΈλ‘ 첫μ€μ μλ―Έμλ 1μ μΆκ°ν΄λ Ό ν μ λ ₯λ°λλ€.
- passenger : μΉκ°μ μΆλ°μ§μ λͺ©μ μ§λ μΆλ°μ§ : λͺ©μ μ§ ννλ‘ λμ λλ¦¬λ‘ μ μ₯νλ€.
- around : μνμ’μ°λ‘ μ΄λν λ λν΄μ§λ μ’νκ°μ΄λ€.
- take_a_taxi : νμμ μΉκ°μ΄ μλμ§ μλμ§ μνλ₯Ό λνλΈλ€.
- arrival : νμμ ν μΉκ°μ΄ λͺ©μ μ§μ λμ°©νμ λ λͺ©μ μ§ μ’νλ₯Ό μ μ₯νλ€.
- target : κ°μ μ΄λνμ μμμ κ° μ μλ μΉκ°μ μμΉλ₯Ό μ μ₯νλ€.
- visited : μ΄λ―Έ λ°©λ¬Έν μ’νλ λ°©λ¬Ένμ§ μκΈ° μν΄ λ°©λ¬Έν μ’νλ₯Ό μ μ₯ν΄λλλ€.
- queue : μ΄λν΄μΌν κ³³μ μ μ₯νλ€.
- move : μ΄λνμλ₯Ό μλ―Ένλ€.
- candidate : κ°μ μ΄λνμλ‘ κ° μ μλ μ’νλ€μ μ μ₯νλ€.
for x, y in queue:
if (0 <= x < N+1 and 0 <= y < N+1) and area[x][y] == 0:
if take_a_taxi and (x, y) == passenger[now]:
del passenger[now]
arrival = (x, y)
break
elif not take_a_taxi and (x, y) in passenger:
target.add((x, y))
else:
for _x, _y in around:
if (x+_x, y+_y) not in visited:
candidate.add((x+_x, y+_y))
visited.add((x, y))
queueμλ κ°μ μ΄λνμλ‘ κ° μ μλ μ’νλ€μ΄ λ€μ΄μλ€.
queueμ μλ μ’νλ₯Ό νλμ© λλ©΄μ μΈλ±μ€ λ²μ λ΄μ μμΌλ©΄μ λ²½μ΄ μλ λ
λ€μ μΈκ°μ§ μ¬ν μ€ λ§λ μν©μμ νλνλ€.
- νμμ μΉκ°μ΄ μκ³ νμ¬ μμΉκ° λͺ©μ μ§λΌλ©΄ ->
- passengerμμ ν΄λΉ μΉκ°μ μμ νλ€.
- arrivalμ λͺ©μ μ§ μ’νλ₯Ό μ μ₯νλ€.
- λ μ΄μ λ€λ₯Έ μ’νλ₯Ό λ³Ό νμ μμΌλ―λ‘ forλ¬Έμ λΉ μ Έλμ¨λ€.
- νμμ μΉκ°μ΄ μκ³ νμ¬ μμΉμ μΉκ°μ΄ μλ€λ©΄ ->
- νμΈ μΉκ° ν보 targetμ νμ¬ μμΉλ₯Ό μ μ₯νλ€.
- κ·Έ μΈ ->
- μνμ’μ°λ₯Ό λλ©΄μ λ°©λ¬Έν μ μ΄ μλ μ’νλ₯Ό candidateμ μ μ₯νλ€.
νμ¬ μμΉμ λ°©λ¬Ένμμ νμνκΈ° μν΄ visitedμ νμ¬ μμΉλ₯Ό μΆκ°νλ€.
if arrival:
take_a_taxi = False
now = arrival
fuel = fuel + move if fuel >= move else -1
break
if target:
take_a_taxi = True
now = sorted(target)[0]
fuel -= move
break
if not candidate:
fuel = -1
break
queue = candidate
move += 1
νμ¬ μ΄λ νμλ‘ κ° μ μλ μ’νλ₯Ό λͺ¨λ νμΈν ν λ€μ μΈκ°μ§ μ¬νμ 체ν¬νλ€.
- λͺ©μ μ§μ λμ°©νλ€λ©΄ ->
- μΉκ°μ΄ λ΄λ¦Όμ νμνκΈ° μν΄ take_a_taxiλ₯Ό Falseλ‘ λ°κΎΌλ€.
- nowμ arrivalμ μ μ₯νμ¬ νμμΉλ₯Ό κ°±μ νλ€.
- μ°λ£κ° μμ§μΈ κ²λ§νΌ μμλ€λ©΄ μμ§μΈλ§νΌ λν΄μ£Όκ³ μλλ©΄ -1λ‘ λ°κΎΌλ€.
- νμΈ μΉκ° νλ³΄κ° μλ€λ©΄ ->
- μΉκ°μ΄ νμμ νμνκΈ° μν΄ take_a_taxiλ₯Ό Trueλ‘ λ°κΎΌλ€.
- nowμ νμΈ μΉκ° ν보 μ€ μ ν 쑰건μ λ§λ μΉκ°μ μμΉλ₯Ό μ μ₯νμ¬ νμμΉλ₯Ό κ°±μ νλ€.
- μ°λ£λ₯Ό μμ§μΈλ§νΌ λΉΌμ€λ€.
- λ€μμΌλ‘ μ΄λν μ’νκ° μλ€λ©΄ ->
- μ°λ£λ₯Ό -1λ‘ λ°κΏ λμ΄μ κ° μ μμμ νμνλ€.
μ μΈκ°μ§ μ¬νμ λͺ¨λ λ§μ§ μλλ€λ©΄
queueλ₯Ό candidateλ‘ λ°κΎΌ ν moveμ 1μ λν΄ λ€μμΌλ‘ μμ§μΈλ€.
'πμκ³ λ¦¬μ¦ > λ°±μ€' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λ°±μ€/python] 14502λ² : μ°κ΅¬μ (0) | 2021.10.06 |
---|---|
[λ°±μ€/python] 14503λ² : λ‘λ΄ μ²μκΈ° (0) | 2021.10.06 |
[λ°±μ€/python] 11660λ² : κ΅¬κ° ν© κ΅¬νκΈ° 5 (0) | 2021.09.20 |
[λ°±μ€/python] 17779λ² : κ²λ¦¬λ§¨λλ§ 2 (0) | 2021.09.18 |
[λ°±μ€/python] 7490λ² : 0 λ§λ€κΈ° (0) | 2021.09.17 |