본문 바로가기

CodingTEST

[백준 9663] N-Queen(JAVA)

반응형

백준 9663번 문제 - N-Queen

 

9663번: N-Queen

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

www.acmicpc.net


문제 분석 

 

 

  • N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓을 수 있는 방법의 수

해결 포인트

 

  • 퀸이 공격할 수 있는 범위 상하좌우, 대각선 칸 수 제한 없이 무제한 !
  • DFS 사용
  • 가로, 세로 줄은 단순하게 퀸이 놓아졌으면 놓기 금지 - 가로,세로 확인할 수 있는 배열 구현
    • 가로 row[N]
    • 세로 col[N]
  • 퀸을 놓은 곳의 가로, 세로 위치를 true로 설정 
    • 퀸 위치 x,y일 때, row[x] = true; col[y] = true;
  • 대각선은 \ 선과 / 선, 2가지 존재 - 대각선도 그룹 제작
    • \ 선 diagonal1[N*2-1]
    • / 선 diagonal2[N*2-1]

 

 

  • / 대각선 그룹 형성 방법 : x + y

 

 

  • \ 대각선 그룹 형성 방법 : x - y

 


코드

 

import java.util.*;
import java.lang.*;
import java.io.*;

public class Main {
    public static int N;
    public static boolean [] diagonal1, diagonal2;
    public static boolean [] row, col;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        N = Integer.parseInt(br.readLine());

        diagonal1 = new boolean[N*2-1];
        diagonal2 = new boolean[N*2-1];
        row = new boolean[N];
        col = new boolean[N];

        long result = 0;
        
        row[0] = true;
        for(int j=0;j<N;j++) {
            col[j] = true;
            diagonal1[j] = true;
            diagonal2[-j+N-1] = true;
            
            result += DFS(0, j, 1);
            
            col[j] = false;            
            diagonal1[j] = false;
            diagonal2[-j+N-1] = false;
        }

        bw.write(result+"\n");
        bw.flush();
        bw.close();
    }
 
    public static int DFS(int x, int y, int count) {
        if(count == N)
            return 1;
        
        int result = 0;

        int i = x+1;
        row[i] = true;
        for(int j=0;j<N;j++) {
            if(col[j]) continue;
            if(checkRoundQ(i,j)) {
                col[j] = true;
                diagonal1[i+j] = true;
                diagonal2[i-j+(N-1)] = true;
                
                result += DFS(i,j, count+1);
                
                col[j] = false;
                diagonal1[i+j] = false;
                diagonal2[i-j+(N-1)] = false;
            }
        }
        row[i] = false;
        
        return result;
    }

    public static boolean checkRoundQ(int x, int y) {
        if(diagonal1[x+y]) return false;
        if(diagonal2[x-y+(N-1)]) return false;
        
        return true;
    }
}

 

반응형

'CodingTEST' 카테고리의 다른 글

[백준 1238] 파티(JAVA)  (1) 2024.02.11
[백준 11404] 플로이드(JAVA)  (1) 2024.02.11
[백준 1967] 트리의 지름(JAVA)  (1) 2024.02.11
[백준 1753] 최단경로(JAVA)  (1) 2024.02.11
[백준 13549] 숨바꼭질 3(JAVA)  (1) 2024.02.11