본문 바로가기

연습문제/JAVA

[백준 java] 3190-뱀

 

3190번: 뱀

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

www.acmicpc.net

 

사과는 : 1, 그냥길은 :0

* 주의할점 *

1. 뱀이 사과를 먹으면 Board의 1(사과) 을 0으로 바꿔줘야한다.

2. X초가 끝난 뒤에 (뱀이 움직이고 난 후) 방향을 움직여아한다

3. for문을 통해 자기자신과 만났는지 확인하고 break로 전체 while문을 빠져나와야 한다

 

뱀의 길이와 위치를 알기위해 snake 큐를 만들었다

q에 이동할 곳을 넣어주고 만약 사과를 먹었다면 Board의 사과만 0으로 없애주고

만약 사과를 먹지 않았다면 큐를 삭제하여 제일 이전에 들어온 큐를 제거하는 방법을 사용했다.

(1.1 에서 1.2로 이동했는데 사과가 없으면 처음에 들어온 1.1을 삭제)

 

 

아래 주석안 코드를 통해 매 시간마다 뱀의 위치와 사과의 위치를 볼 수 있습니다

import java.util.*;

public class B3190 {
    static int N,A,T;   //NxN, Apple , Turn
    static int count =0;
    static int dir =1;
    static int[][] Board;
    static Map<Integer,String> turn = new HashMap<>();

    static int[][] D = {{-1,0},{0,1},{1,0},{0,-1}}; //상우하좌 시계방향

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        A = sc.nextInt();
        Board = new int[N][N];
        int[][] apple = new int[A][2];
        for(int i=0; i<A; i++){
            apple[i][0] = sc.nextInt();
            apple[i][1] = sc.nextInt();
        }
        T = sc.nextInt();
        for(int i=0; i<T; i++){
            turn.put(sc.nextInt(), sc.next());
        }
        for (int[] ints : apple) {
            Board[ints[0]-1][ints[1]-1] = 1;
        }
        move();
        System.out.println(count);
    }

    private static void move() {
        Node node = new Node(0,0);
        Queue<int[]> snake = new LinkedList<>();
        snake.add(new int[]{0,0});

        Loop1:
        while(true){
            if(turn.get(count)!=null){
                if(Objects.equals(turn.get(count), "D")){
                    if(dir==3){
                        dir =0;
                    }else{
                        dir +=1;
                    }
                }else{
                    if(dir==0){
                        dir =3;
                    }else{
                        dir -=1;
                    }
                }
            }
            count += 1;
            int nr = node.row+D[dir][0];
            int nc = node.col+D[dir][1];
            if(nr<0||nr>=N||nc<0||nc>=N) break;

            for (int[] ints : snake) {
                if(nr==ints[0] && nc==ints[1]) break Loop1;
            }

            if(Board[nr][nc]==1){
                snake.add(new int[]{nr,nc});
                Board[nr][nc]=0;
            }else{
                snake.add(new int[]{nr,nc});
                snake.remove();
            }
            node.row = nr;
            node.col = nc;

            /*
            System.out.println("======= c: "+count+", l: "+len+"=======");
            for (int[] ints : snake) {
                System.out.println(Arrays.toString(ints));
            }
            for(int i=0; i<N; i++){
                for(int j=0; j<N; j++){
                    System.out.print(Board[i][j]+" ");
                }
                System.out.println("");
            }

             */

        }
    }

    private static class Node {
        int row,col;
        Node(int r, int c){
            row = r;
            col = c;
        }
    }
}