문제
https://www.acmicpc.net/problem/16930
진영이는 다이어트를 위해 N×M 크기의 체육관을 달리려고 한다. 체육관은 1×1 크기의 칸으로 나누어져 있고, 칸은 빈 칸 또는 벽이다. x행 y열에 있는 칸은 (x, y)로 나타낸다.
매 초마다 진영이는 위, 아래, 오른쪽, 왼쪽 중에서 이동할 방향을 하나 고르고, 그 방향으로 최소 1개, 최대 K개의 빈 칸을 이동한다.
시작점 (x1, y1)과 도착점 (x2, y2)가 주어졌을 때, 시작점에서 도착점으로 이동하는 최소 시간을 구해보자.
입력
첫째 줄에 체육관의 크기 N과 M, 1초에 이동할 수 있는 칸의 최대 개수 K가 주어진다.
둘째 줄부터 N개의 줄에는 체육관의 상태가 주어진다. 체육관의 각 칸은 빈 칸 또는 벽이고, 빈 칸은 '.', 벽은 '#'으로 주어진다.
마지막 줄에는 네 정수 x1, y1, x2, y2가 주어진다. 두 칸은 서로 다른 칸이고, 항상 빈 칸이다.
출력
(x1, y1)에서 (x2, y2)로 이동하는 최소 시간을 출력한다. 이동할 수 없는 경우에는 -1을 출력한다.
제한
- 2 ≤ N, M ≤ 1,000
- 1 ≤ K ≤ 1,000
- 1 ≤ x1, x2 ≤ N
- 1 ≤ y1, y2 ≤ M
풀이
보통 행은 y 열은 x로 쓰지 않나..!
이 문제는 반대여서 중간에 다 뜯어고쳤다.
from collections import deque
n, m, k = map(int, input().split())
gym = [list(input()) for _ in range(n)]
time = [[-1]*(m) for _ in range(n)]
sx, sy, ex, ey = map(int, input().split())
sx -= 1
sy -= 1
ex -= 1
ey -= 1
dir = [(-1, 0), (1, 0), (0, -1), (0, 1)]
time[sx][sy] = 0
q = deque([(sx, sy)])
while q:
x, y = q.popleft()
if x == ex and y == ey:
print(time[x][y])
exit()
for d in dir:
for i in range(1, k+1):
dx = x + d[0]*i
dy = y + d[1]*i
if dx < 0 or dx >= n or dy < 0 or dy >= m:
break
if gym[dx][dy] == '#':
break
if time[dx][dy] == -1:
time[dx][dy] = time[x][y]+1
q.append((dx, dy))
print(-1)
97퍼에서 시초 뜨는 코드
from collections import deque
input = __import__('sys').stdin.readline
n, m, k = map(int, input().split())
gym = [list(input()) for _ in range(n)]
time = [[-1]*(m) for _ in range(n)]
sx, sy, ex, ey = map(int, input().split())
sx -= 1; sy -= 1; ex -= 1; ey -= 1
dir = [(-1, 0), (1, 0), (0, -1), (0, 1)]
time[sx][sy] = 0
q = deque([(sx, sy)])
while q:
x, y = q.popleft()
for d in dir:
for i in range(1, k+1):
dx = x + d[0]*i
dy = y + d[1]*i
if dx < 0 or dx >= n or dy < 0 or dy >= m:
break
if gym[dx][dy] == '#':
break
if time[dx][dy] != -1 and time[dx][dy] <= time[x][y]:
break
if time[dx][dy] == -1:
time[dx][dy] = time[x][y]+1
q.append((dx, dy))
print(time[ex][ey])
readline sys에서 가져오고 중간에
if time[dx][dy] != -1 and time[dx][dy] <= time[x][y]:
이 조건문 넣고 pypy3로 넣었더니 통과함
근데 중간 조건문은 이해가 안간다.
만약에 현재위치 이고 time이 아래와 같을 때
1 2 2
4 4 4
1 -1 1
이런 상태면 어떻게 처리되는거지
+) 오타 못찾고 헛짓거리하다 영진오빠가 찾아줬다ㅎㅎ ㄳㄳ!
'알고리즘 스터디' 카테고리의 다른 글
[백준] 15989 1,2,3 더하기 4 파이썬 (0) | 2022.01.23 |
---|---|
[백준] 1890 점프 파이썬 (0) | 2022.01.23 |
[백준] 17086 아기 상어2 - 파이썬 (2) | 2022.01.16 |
[백준] 14226 이모티콘 파이썬 (1) | 2022.01.08 |
[백준] 13913 숨바꼭질 4 파이썬 (0) | 2022.01.07 |