from collections import deque
import sys
def countvisit():
count = 0
for i in range(N):
for j in range(M):
if arr[i][j] == 2:
count += 1
return count
def func(x,y,see):
for _ in range(4):
if 0<=x<N and 0<=y<M:
if arr[x][y] == 0:
arr[x][y] = 2 # visit
if (0==y or (0<=y and (arr[x][y-1] != 0))) and (x==0 or (0<=x-1 and (arr[x-1][y] != 0))) and (y==M-1 or (y+1<M and (arr[x][y+1] != 0))) and (x==N-1 or (x+1<N and (arr[x+1][y] != 0))):
if see == 0 and (x+1<N and arr[x+1][y] == 2):
func(x+1,y,see)
elif see == 1 and (0<=y-1 and arr[x][y-1] == 2):
func(x,y-1,see)
elif see == 2 and (0<=x-1 and arr[x-1][y] == 2):
func(x-1,y,see)
elif see == 3 and (y+1<M and arr[x][y+1] == 2):
func(x,y+1,see)
else:
print(countvisit())
sys.exit(0)
elif see == 0 and 0<=y-1:
if arr[x][y-1] == 0: # ↑
func(x,y-1,3)
elif see == 1 and 0<=x:
if arr[x-1][y] == 0: # →
func(x-1,y,0)
elif see == 2 and y+1<M:
if arr[x][y+1] == 0: # ↓
func(x,y+1,1)
elif see == 3 and x+1<N:
if arr[x+1][y] == 0: # ←
func(x+1,y,2)
see = (see - 1) % 4
N,M = map(int,input().split())
R,C,see = map(int,input().split())
arr = [[0] * M for _ in range(N)]
for i in range(N):
read = input().split()
for j in range(M):
arr[i][j] = int(read[j])
func(R,C,see)
arr[x][y]를 0과 비교해서 같으면 visit으로 가정하고 2로 바꿔줍니다.
4방향을 전부 비교해서 조건문이 길어졌습니다.
0==y or (0<=y and (arr[x][y-1] != 0))
맨 앞 조건문만 확인하면 y == 0은 배열의 끝에 있는지를 비교하고, (0<=y and (arr[x][y-1] != 0))은 배열의 끝은 아니지만 청소를 했던 곳인지를 확인합니다. 이 조건문에 들어온다는 소리는 네 방향 모두 청소가 이미 되어있거나 벽인 경우입니다.
조건문에 들어왔다면 if ~ elif를 통해 바라보는 방향과, 내 뒤가 벽인지를 확인합니다.
내 뒤가 벽이 아니라면 한 칸 후진하는 c 조건을 따라 2번으로 넘어갑니다.
벽이 아니라면 d 조건으로 청소한 영역을 체크하고 종료합니다.
그다음 나오는 4개의 elif를 확인하면 됩니다.
see가 0이면 동쪽을 보고 있는데 왼쪽 방향이 청소가 됐는지 확인하므로 y-1을 비교해야 합니다.
같은 방법으로 4방향을 비교합니다.
모든 조건문이 맞지 않으면 왼쪽 방향으로 회전을 합니다.
see = (see - 1) % 4로 동쪽을 보는 0에서 북쪽을 보는 3으로 갈 수 있습니다.
백준 1966 - 프린터 큐 Python (0) | 2020.11.04 |
---|---|
백준 10597 - 순열 장난 Python (0) | 2020.11.03 |
백준 2606 - 바이러스 C++ (0) | 2019.11.25 |
프로그래머스 Level 1 - 체육복(C++) (0) | 2019.11.24 |
[2020카카오공채] 문자열 압축(C++) (0) | 2019.11.13 |