[알고리즘] 순환(Recursion) 06 - N-Queens

1 minute read

순환(Recursion) 응용편 : N-Queens

인프론 강의를 보면서 연습하고 기록하고 있습니다

상태공간트리 : 찾는 해를 포함하는 트리
해가 존재한다면 그것은 반드시 이 트리의 한 노드에 해당함
따라서 이 트리를 체계적으로 탐색하면 해를 구할 수 있음

되추적 기법(Backtracking)
상태공간 트리를 깊이 우선 방식으로 탐색하여 해를 찾는 알고리즘

의사코드

return-type queens(arguments){
	if(non-promising){
		report failure and return;
	}else if success{
		report answer and return;
	}else{
		visit children recursively;
	}
}

Java코드

private static int N = 8; //범위
int[] cols = new int[N+1];

public static void main(String[] args) {
	queens(0);
}

boolean queens (int level) {
	//같은 열, 혹은 대각선에 위치해있어서 꽝
	if(!promising(level)) {
		return false;

	//성공
	}else if(level == N) {
		//실제 말이 위치 출력
		for(int i=1; i<=N; i++) {
			System.out.println("(" +i+", " + cols[i] + ")");
		}
		return true;

	//현재 레벌의 아랫쪽 레벨 검사 level+1;
	}else {
		for(int i=1; i<=N; i++) {
			cols[level+1] = i;
			if(queens(level+1)) {
				return true;
			}
		}
	}
	return false;
}

boolean promising(int level) {
	for(int i=1; i<level; i++) {
		if(cols[i] == cols[level]) { //같은 열에 놓였는지 검사
			return false;
		}else if(level-i == Math.abs(cols[level]-cols[i])) { //대각선에 놓여있는지 검사
			return false;
		}
	}
	return true;
}
(1, 1)
(2, 5)
(3, 8)
(4, 6)
(5, 3)
(6, 7)
(7, 2)
(8, 4)