https://www.acmicpc.net/problem/3190
3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
스네이크 게임을 직접 구현해 본 입장으로서 쉬울 줄 알았지만 매우 오래 삽질을 하였다. 두 가지 헤맨 포인트가 있는데 첫 번째 포인트는 뱀의 방향 전환 정보 X와 C에서 X가 게임 전체 시간이다. 예를 들어 8D, 10D 라면 8초 진행한 후 꺾고 2초 후 다시 꺾는다.(나는 8초 후, 10초 후라고 생각함) 두 번째 포인트는 보통의 뱀 게임과 달리 여기서는 머리가 먼저 움직인다! 무슨 뜻이냐면 내가 이동으로 인해 꼬리가 사라질 위치에 미리 머리를 위치하면 꼬리를 밟은 판정이 된다. 그래서 뱀 게임의 고급 기술인 원형을 유지하고 빙글빙글 도는 게 불가능하다.(국룰 위반이라 생각함)
import java.util.*;
import java.io.*;
public class Main {
static BufferedReader br;
static StringTokenizer st;
static StringBuilder sb;
public static void main(String[] args) throws Exception {
br = new BufferedReader(new InputStreamReader(System.in));
sb = new StringBuilder();
N = Integer.parseInt(br.readLine());
map = new int[N][N];
K = Integer.parseInt(br.readLine());
dq = new ArrayDeque<>();
dq.add(new Point(0, 0));
map[0][0] = 2;
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
int row = Integer.parseInt(st.nextToken()) - 1;
int col = Integer.parseInt(st.nextToken()) - 1;
map[row][col] = 1;
}
int l = Integer.parseInt(br.readLine());
for (int i = 0; i < l; i++) {
st = new StringTokenizer(br.readLine());
int dist = Integer.parseInt(st.nextToken()) - time;
for (int j = 0; j < dist; j++) {
time++;
if (!move()) {
System.out.println(time);
return;
}
}
if (st.nextToken().equals("D"))
dest = (dest + 1) % 4;
else {
if (dest == 0)
dest = 3;
else
dest = (dest - 1) % 4;
}
}
while(true) {
time++;
if(!move()) {
System.out.println(time);
return;
}
}
}
static int N, K, map[][], time = 0, dest = 1, dr[] = { -1, 0, 1, 0 }, dc[] = { 0, 1, 0, -1 };
static Point head, tail;
static Deque<Point> dq;
static boolean move() {
head = dq.peek();
int hr = head.row + dr[dest];
int hc = head.col + dc[dest];
if (hr < 0 || hr >= N || hc < 0 || hc >= N) // 벽
return false;
if (map[hr][hc] != 1) {
if (map[hr][hc] == 2)
return false;
tail = dq.pollLast();
map[tail.row][tail.col] = 0;
}
map[hr][hc] = 2;
dq.addFirst(new Point(hr, hc));
return true;
}
static class Point {
int row, col;
public Point(int row, int col) {
super();
this.row = row;
this.col = col;
}
}
}
'Algorithm > 문제' 카테고리의 다른 글
[백준 / JAVA] 21608. 상어 초등학교 (G5) (0) | 2024.04.10 |
---|---|
[백준 / JAVA] 20055. 컨베이어 벨트 위의 로봇 (G5) (0) | 2024.04.10 |
[백준 / JAVA] 16935. 배열 돌리기 3 (G5) (0) | 2023.08.26 |
[백준 / JAVA] 16927. 배열 돌리기 2 (G5) (0) | 2023.08.26 |
[백준 / JAVA] 1107. 리모컨 (G5) (0) | 2023.08.16 |