알고리즘

백준 1331번 나이트 투어 (JAVA)

박카스마시며코딩 2023. 2. 3. 12:57

https://www.acmicpc.net/problem/1331

 

1331번: 나이트 투어

나이트 투어는 체스판에서 나이트가 모든 칸을 정확히 한 번씩 방문하며, 마지막으로 방문하는 칸에서 시작점으로 돌아올 수 있는 경로이다. 다음 그림은 나이트 투어의 한 예이다. 영식이는 6×

www.acmicpc.net

 

 

 

package BOJ.simulation;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

public class BOJ_1331 {
    private static final int SIZE = 6;
    private static final String VALID = "Valid";
    private static final String INVALID = "Invalid";
    private static final int INPUT_SIZE = 36;
    private static final int[] DY = {-2,-1,1,2,2,1,-1,-2};
    private static final int[] DX = {1,2,2,1,-1,-2,-2,-1};
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        boolean[][] visited = new boolean[SIZE][SIZE];
        int[] prev = new int[2];
        int[] start = new int[2];
        boolean result = true;
        for(int i = 0 ; i < INPUT_SIZE ; i++){
            int[] position = getPosition(br.readLine());
            if(visited[position[0]][position[1]]){
                result = false;
                break;
            }
            if(i == 0){
                start = position;
            }
            if(i != 0 && !checkMove(prev,position)){
                result = false;
                break;
            }
            visited[position[0]][position[1]] = true;
            prev = position;

        }
        if (result && checkMove(prev,start)){
            System.out.println(VALID);
        }else{
            System.out.println(INVALID);
        }
    }
    private static int[] getPosition(String str){
        int first = str.charAt(0) - 'A';
        int second = str.charAt(1) - '1';
        return new int[] {first,second};
    }
    private static final boolean checkMove(int[] prev, int[] next){
        for(int j = 0 ; j < 8 ; j++){
            int ny = prev[0] + DY[j];
            int nx = prev[1] + DX[j];
            if(ny == next[0] && nx == next[1]){
                return true;
            }
        }
        return false;
    }
}