본문 바로가기

ALGORITHM

백준 1331 나이트 투어 (Java)

1. 문제 링크

 

1331번: 나이트 투어

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

www.acmicpc.net

 

2. 문제 및 입출력예제

3. 문제 풀이

나이트의 이동 범위인지 확인하는 과정이 필요하다. 전에 있던 좌표와 x축 절댓값 차이가 2이면서 y축 절댓값 차이가 1인 경우거나  x축 절댓값 차이가 1이면서 y축 절댓값 차이가 2인 경우인지 판단한다. 또한 방문했던 좌표인지 확인하는 과정도 필요하다. 그 과정에서 flag가 바뀌었는지 판단해서 "Valid" 또는 "Invalid"를 출력한다.

 

4. 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException{
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       boolean[][] map = new boolean[6][7];
       boolean flag = true;
       String str = br.readLine();
       int firstOne = str.charAt(0)-'A';
       int firstTwo = str.charAt(1)-'0';
       int bOne = firstOne;
       int bTwo = firstTwo;
       map[firstOne][firstTwo] = true;
       for(int i=0;i<35;i++) {
    	   str = br.readLine();
    	   int one = str.charAt(0)-'A';
    	   int two = str.charAt(1)-'0';
    	   if((Math.abs(bOne-one)==2 && Math.abs(bTwo-two)==1)
    		|| (Math.abs(bOne-one)==1 && Math.abs(bTwo-two)==2)) {
    		   if(map[one][two]) {
	    		   flag = false;
	    		   break;
	    	   }
	    	   map[one][two] = true;
	    	   bOne = one;
	    	   bTwo = two;
    	   }
    	   else {
    		   flag = false;
    		   break;
    	   }
       }
       if(flag) {
    	   if((Math.abs(bOne-firstOne)==2 && Math.abs(bTwo-firstTwo)==1)
	       		|| (Math.abs(bOne-firstOne)==1 && Math.abs(bTwo-firstTwo)==2)) {
	    	   flag = true;
	       }
	       else {
	    	   flag = false;
	       }
       }
       
       if(flag) {
    	   System.out.println("Valid");
       }
       else {
    	   System.out.println("Invalid");
       }
       
	}
}