[백준] N-Queen (java) Backtracking

2020-04-08

N-Queen (백준> Backtracking)

문제 링크

문제설명

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.

N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (1 ≤ N < 15)

출력

첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.

예제 입력 1 복사

8

예제 출력 1 복사

92


풀이

package Backtracking;

import java.util.*;

//1h
public class beak_NQueen {

	static int n;
	static int answer = 0;
	//cols에는 각 행마다의 "열" 값이 들어있음
	static int cols[]; //cols[level] = x;라면 level이라는 행에 x값은 열; 고로 (level,x) 의미
	
	static public boolean isPossible(int level) {
		//level행에 걸치는지 or i열에 걸치는지
		//대각선에 위치하는지
		//의 조건에만 false
		
		//level전까지의 행의 열값 중 같은것이 존재하는지
		for(int i=0; i<level; i++) {
			//새로 넣고 들어온 level행의 i열 퀸과 전에 존재하던 열에 겹치는게 있다면
			if(cols[level] == cols[i])
				return false;
			//i번째 퀸의 위치와 level 위치의 퀸이 대각선에 존재할 때,
			//level행 - i행 == level열 - i열 이 같으면 대각선!
			if(Math.abs(level-i) == Math.abs(cols[level]- cols[i]))
				return false;
		}
		
		return true;
	}
	
	static public void back_tracking(int level) {
		//level : level-1 까지는 검증 된것이고, level 행을 검증할 차례
		if(level == n) {//0행부터시작해서 n-1까지 만족한거니까 n이라면 그 전을 전부 만족한것
			answer++;
			//만약 각 행의 퀸의 위치(열)를 알고싶다면 cols[i]출력하면 됨
			//for(i<n) sout(cols[i]);
		}
		
		else {
			//level-1까지는 조건대로 만족이고
			//level 행에 (0~n)열까지 퀸 넣어보기
			
			for(int i=0; i<n; i++) {
				cols[level] = i; //level행에 i번째 열에 퀸 넣어보기
				if(isPossible(level)) {
					//퀸을 놔도 되면
					// 다음행으로 넘어가기
					back_tracking(level+1);
				}
			}
		}
	}

	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		n = sc.nextInt();
		
		cols = new int[n];
		boolean visited[][] = new boolean[n][n];
		
		back_tracking(0);
		
		System.out.println("answer " + answer);
	}
}

후기 (1h)