일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- NumPy
- RNN
- Java
- C언어
- C
- 주식분석
- LSTM
- 딥러닝
- tensorflow
- 하이브
- 알고리즘
- codingthematrix
- GRU
- 텐서플로
- 선형대수
- HelloWorld
- yarn
- recursion
- scrapy
- collections
- graph
- 하둡2
- hadoop2
- effective python
- Sort
- python
- 파이썬
- 코딩더매트릭스
- 그래프이론
- hive
- Today
- Total
EXCELSIOR
Recursion 응용 : N-Queens Problem 본문
1. N - Queens Problem ( 8 - Queens Problem )
어떠한 행, 열, 대각선에 말이 겹치지 않도록 놓는 방법
1) 상태공간트리(State-Space Tree)
상태공간트리란 찾는해를 포함하는 트리를 말한다. 즉 해가 존재한다면 그것은 반드시 이 트리의 어떠 한 노드에 해당한다.
→ 상태공간 트리의 모든 노드를 탐색해야 하는 것은 아니다.
2) 되추적 기법(Backtracking)
상태공간 트리를 깊이 우선 방식으로 탐색하여 해를 찾는 알고리즘을 말한다.
[출처: https://ko.wikipedia.org]
2. Design Recursion
1) 전체 pseudocode
int [ ] cols = new int [N+1];
return-type(boolean) queens( arguments = int level ){
if non-promising
report failure and return;
else if success (level == N) // level==N이면 모든말이 놓였다는 의미이고 따라서 성공이다.
report answer and return;
else
visit children recursively; // level + 1 번째 말을 각각의 열에 높은 후 recursion을 호출한다.
}
2) promising Test pseudocode
boolean promising(int level){
for(int i=1; i<level; i++){
if(cols[i]==cols[level]) // 같은 열에 놓여있는지 검사
return false;
else if on the same diagonal //같은 대각선에 놓였는지 검사
// level - i = | cols[level]-cols[i] |
return false;
}
return true;
}
3. 소스 코드
public class NQueensProblem { public static final int N = 8; public static int[] cols = new int[N+1]; public static 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; } for(int i=1; i<=N; i++){ cols[level+1] = i; if(queens(level+1)) return true; } return false; } public static 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; } public static void main(String[] args) { queens(0); } }
'Algorithms' 카테고리의 다른 글
기본적인 정렬 알고리즘 (1) | 2016.11.24 |
---|---|
멱집합 (2) | 2016.11.21 |
Recursion의 응용: 미로찾기 (0) | 2016.11.11 |
Recursion의 개념과 기본 예제들 - 3 (0) | 2016.11.11 |
Recursion의 개념과 기본 예제들 - 2 (0) | 2016.11.10 |