취준/백준
[백준][Python][3190][브루트포스] 뱀
puff
2020. 2. 11. 15:09
문제 : https://www.acmicpc.net/problem/3190
3190번: 뱀
문제 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다. 뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따
www.acmicpc.net
최적화와 기타등등 아무것도 신경안쓴 누더기 코드를 보는 당신! 축하드립니다.
잘난 코드는 다들 비슷하지만 못난 코드는 개성있게 못났다는 사실을 기억하십시오
뱀 문제는 문제를 그대로 구현하면 된다.
나는 dictionary를 잘 쓰니까 요번에도 사과 + 위치변경 확인용으로 썼다.
신경써야 할 곳은 다음과 같다.
- 벽에 부딪히면 끝
- 자기 몸에 부딪히면 끝
- 사과 다먹는다고 끝 아님
몸은 Deque를 써 pop,appendleft로 길이조절 하기가 쉬워졌다.
사실 저 numapple은 안써도 된다. 3번 조건을 멋대로 만들어버렸다.
나머지 코드는 보면 이해할만 하니 패스.
import sys
from collections import deque
dx = [1,0,-1,0]
dy = [0,1,0,-1]
def changedir(c,v):
if c=="L":
return (v+3)%4
elif c=="D":
return (v+1)%4
else:
return v
apple = dict()
movement = dict()
n = int(input())
k = int(input())
numapple = k
ret = 1
for a in range(k):
apple[tuple([int(i)-1 for i in sys.stdin.readline().rstrip().split()])] = True
l = int(input())
for a in range(l):
k,v = [i for i in sys.stdin.readline().rstrip().split()]
movement[int(k)] = v
q = deque()
q.append((0,0))
vector = 0
while True:
if (q[0][0]+dy[vector],q[0][1]+dx[vector]) in q:
print(ret)
sys.exit()
else:
q.appendleft((q[0][0]+dy[vector],q[0][1]+dx[vector]))
if q[0] in apple:
if apple[q[0]]:
apple[q[0]] = False
numapple-=1
else:
q.pop()
else:
q.pop()
if ret in movement:
if movement[ret] =="L" or movement[ret] =="D":
vector = changedir( movement[ret] ,vector)
movement[ret] = "0"
if q[0][0]>=n or q[0][0]<0 or q[0][1]>=n or q[0][1]<0 :
print(ret)
sys.exit()
else:
ret+=1