https://www.acmicpc.net/problem/9663
9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int[][] a = new int[n][n];
br.close();
int cnt = 0;
for(int i=0; i<n; i++) {
cnt+=nqueen(0,i,a);
}
bw.write(cnt+" ");
bw.close();
}
public static int nqueen(int i, int j, int[][] board) {
if(board[i][j]==-1) return 0;
if(i==board.length-1&&board[i][j]==0) {return 1;}
board[i][j] = -1;
int cnt = 0;
for(int k = 0; k<board.length; k++) {
if(check(i+1,k,board))cnt+=nqueen(i+1,k,board);
}
board[i][j] = 0;
return cnt;
}
public static boolean check(int i, int j, int[][] board) {
for(int k = 0; k<board.length; k++) {
if(board[k][j]==-1) return false;
else if(board[i][k]==-1) return false;
}
int k = i; int l = j;
while(k<board.length&&l<board.length) {
if(board[k++][l++] == -1) return false;
}
k = i; l = j;
while(k>=0&&l>=0) {
if(board[k--][l--] == -1) return false;
}
k = i; l = j;
while(k<board.length&&l>=0) {
if(board[k++][l--] == -1) return false;
}
k = i; l = j;
while(k>=0&&l<board.length) {
if(board[k--][l++] ==-1) return false;
}
return true;
}
}
'백준' 카테고리의 다른 글
백준 백트래킹 - 14888번 : 연산자 끼워넣기 (0) | 2022.02.15 |
---|---|
백준 백트래킹 - 2580번 : 스도쿠 (1) | 2022.02.14 |
백준 백트래킹 - 15652번 : N과 M (4) (0) | 2022.02.11 |
백준 백트래킹 - 15651번 : N과 M (3) (1) | 2022.02.11 |
백준 백트래킹 - 15650번 : N과 M (2) (0) | 2022.02.11 |