본문 바로가기

알고리즘/백준

[JAVA]백준_9663_NQueen

문제 : https://www.acmicpc.net/problem/9663

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

문제 유형대표적인 Backtracking 문제

풀이 방식

dfs의 깊이를 행으로 생각하고

1) check_col : 열체크 배열

2) check_diagonal1 : 대각선 체크 배열 1 ( check_diagonal1[row+col] ) ↗↙

3) check_diagonal2 : 대각선 체크 배열 2 ( check_diagonal1[row-col+N]) ↖↘

 

ex ) N = 3일때 

대각선 체크 배열

 

소스코드

package BOJ;

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

public class BOJ_9663_NQueen_Main {

	private static int N, ans;
	private static boolean[] check_col;
	private static boolean[] check_diagonal1;//↗↙
	private static boolean[] check_diagonal2;//↖↘

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		check_col = new boolean[N];
		check_diagonal1 = new boolean[N*2];
		check_diagonal2 = new boolean[N*2];
		ans=0;
		backtracking(0);
		System.out.println(ans);
	}

	private static void backtracking(int row) {
		if(row==N) {
			ans++;
			return;
		}
		
		for (int col = 0; col < N; col++) {
			if(check(row,col)) {
				check_col[col] = true;
				check_diagonal1[row+col] = true;
				check_diagonal2[row-col+N] = true;
				backtracking(row+1);
				check_diagonal1[row+col] = false;
				check_diagonal2[row-col+N] = false;
				check_col[col] = false;
			}
		}
		
	}

	private static boolean check(int row, int col) {
		
		if(check_col[col]) return false;
		
		if(check_diagonal1[row+col]) return false;
		
		if(check_diagonal2[row-col+N]) return false;
		
		return true;
	}

}

'알고리즘 > 백준' 카테고리의 다른 글

[JAVA]백준_10282_해킹  (0) 2020.08.12
[JAVA]백준_1713_후보추천하기  (0) 2020.08.07
[JAVA]백준_2503_숫자야구  (0) 2020.08.06
[JAVA]백준_3187_양치기꿍  (0) 2020.08.05
[JAVA]백준_11967_불켜기  (0) 2020.08.04