알고리즘/백준

[백준 - 3190] 골드5 - 뱀

www.acmicpc.net/problem/3190

 

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

 

1. 유형

시뮬

 

2. 풀이

리스트를 사용해서 머리부분은 인덱스가 끝 부분이고, 꼬리는 인덱스가 0 일 때이다.

 

방향은 시계방향과 반시계 방향을 구분해서 결정한다.

 

3. 코드

package 구현.삼성역태;

import java.util.ArrayList;
import java.util.Scanner;

public class back_3190뱀 {
	static int dr[] = {-1,0,1,0};
	static int dc[] = {0,1,0,-1};//위 오 아래 왼
	static class Pair{
		int t;
		char dir;
		public Pair(int t, char dir) {
			this.t=t;
			this.dir=dir;
		}
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int k = sc.nextInt();
		int map[][]= new int[n][n];
		boolean visit[][] = new boolean[n][n];
		for(int i=0; i<k; i++) {
			int r=sc.nextInt()-1;
			int c= sc.nextInt()-1;
			map[r][c] = 1;
		}
		int l=sc.nextInt();
		ArrayList<Pair> list = new ArrayList<>();
		for(int i=0; i<l; i++) {
			int t= sc.nextInt();
			char dir = sc.next().charAt(0);
			list.add(new Pair(t+1,dir));
		}
		int time=0;
		int dir=1;
		ArrayList<int []> snake = new ArrayList<>();
		snake.add(new int[] {0,0});
		visit[0][0]= true;
		while(true){
			time++;
			for(int i=0;i<list.size(); i++) {
				if(list.get(i).t==time) {
					if(list.get(i).dir=='D') {//시계
					  	dir = (dir+1)%4;
					}else {//반시계
						dir = (dir-1);
						if(dir==-1) dir=3;
					}
					break;
				}
			}
			int head = snake.size()-1;
			int nr = snake.get(head)[0]+dr[dir];
			int nc = snake.get(head)[1]+dc[dir];
			if(nr<0 || nr>=n || nc<0 || nc>=n || visit[nr][nc]) break;//이탈인 경우, 몸
			else if(map[nr][nc] == 1) {//사과인경우
				visit[nr][nc]= true;
				map[nr][nc] = 0;
			}else if(map[nr][nc]==0) {
				visit[nr][nc]= true;
				visit[snake.get(0)[0]][snake.get(0)[1]]= false;
				snake.remove(0);
			}
			snake.add(new int[] {nr,nc});
		}
		System.out.println(time);
	}
}

 

시계 반시계

			for(int i=0;i<list.size(); i++) {
				if(list.get(i).t==time) {
					if(list.get(i).dir=='D') {//시계
					  	dir = (dir+1)%4;
					}else {//반시계
						dir = (dir-1);
						if(dir==-1) dir=3;
					}
					break;
				}
			}