N-Queens
2020-04-27
간단하지만 재귀의 핵심개념이라 할 수 있는 N-Queens(백트래킹)에 대해서 설명합니다.
백트래킹
백트래킹은 모든 경우의 수를 검색하는 것보다,
특정조건을 만족하는 모든 경우의 수를 찾을 때 사용하기에 유용한 알고리즘입니다.
N-Queens 은 백트래킹을 설명하기 가장 좋은 문제입니다.
N-Queens Problem
체스의 퀸은 가로방향,세로방향,대각선방향으로 이동할 수 있다.
이때, N*N크기의 체스판이 있다고 할때 N개의 퀸을 서로 잡아먹지 못하게 배치하는 방법을 찾아라.
N-Queen Problem이 위반되지 않는 조건은 아래와 같다.
-
한 행에 퀸이 두개 놓일 수 없다.
-
한 열에 있지 않아야 한다. (b != d)
-
한 행에 있지 않아야 한다. (a != c)
-
대각선에 있지 않아야 한다 ( a-c !- [b-d])
java
public class NQueenProblem {
private int N = 4;
private int cols[] = new int [4];
public static void main(String [] args) {
NQueenProblem solution = new NQueenProblem();
solution.backTracking(0);
}
public void backTracking(int row) {
if(row == N) {
for(int i = 0; i < N; i++) {
System.out.println(cols[i]);
}
System.out.println("");
}
else {
for(int i = 0; i < N; i++) {
cols[row] = i;
if(isPossible(row)) backTracking(row+1);
}
}
}
public boolean isPossible(int row) {
for(int i = 0; i < row; i++) {
if(cols[i] == cols[row] || Math.abs(row-i) == Math.abs(cols[row]-cols[i])) {
return false;
}
}
return true;
}
}
참고자료 : https://bumbums.tistory.com/3