BOJ 9663 N-Queen
1. 문제 링크
https://www.acmicpc.net/problem/9663
2. 문제 해설
퀸이 체스판에서 서로 공격할 수 없으려면 3가지 조건을 다 만족해야한다. 같은 행, 같은 열, 대각선 상에 퀸이 존재하면 안된다.
여기서 우리가 퀸을 한 행에는 한개씩만 두기로 해보자. 그렇다면 퀸이 같은 행에 존재하는 경우는 없으므로 조건 중에 1가지는 생각하지 않아도 된다.
1차원 배열을 이용하여서 퀸의 위치를 표현했다. queen[i] = j 라고 하면, i번째 행의 퀸은 j열에 존재한다라는 의미이다.
퀸을 놓는 것은 백트래킹 과정을 이용하여 간단하게 해결가능하다. 23~37줄의 solve 메서드를 살펴보자.
solve 메서드의 매개변수는 r로 현재 행을 의미한다. 그러므로 r == n 이 될 때, solve 메서드를 탈출한다.
r행에 퀸을 i열에 놓았다면 r행의 이전 행에 위치하는 퀸들과 r행 퀸의 위치를 비교하면서 서로 공격할 수 없는지 살펴본다.
공격할 수 없다면 다음 행에도 퀸을 놓는다. (solve 메서드 재귀적으로 호출)
3. 코드 보기
import java.io.*; public class Main { static int n, ans; static int[] queen; 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()); ans = 0; queen = new int[n]; solve(0); bw.write(Integer.toString(ans)); br.close(); bw.flush(); bw.close(); } static void solve(int r) { if (r == n) { ans++; return; } for (int i = 0; i < n; i++) { // r행의 열들을 다 살펴봄. queen[r] = i; if (isPossible(r)) { solve(r + 1); } } } static boolean isPossible(int r) { // r행 이전의 행들에 존재하는 퀸들과 r행의 퀸을 비교하여 가능한지 여부 파악 for (int i = 0; i < r; i++) { if (queen[r] == queen[i] || Math.abs(r - i) == Math.abs(queen[r] - queen[i])) { return false; } } return true; } }
'PS > BOJ' 카테고리의 다른 글
BOJ 14891 톱니바퀴 [Java] (0) | 2022.03.14 |
---|---|
BOJ 2457 공주님의 정원 [Java] (0) | 2022.03.03 |
BOJ 11559 Puyo Puyo [Java] (0) | 2022.02.09 |
BOJ 15686 치킨 배달 [Java] (0) | 2022.02.01 |
BOJ 1260 DFS와 BFS [Java] (0) | 2022.01.31 |