현재 노드까지의 상태를 볼 때, 여기서 진행하여 목표를 달성할 수 있을까? (유망한가?)
- 유망하지 않은 경우 : 함수를 종료한다 / 유망한 경우 : 아래의 과정을 진행한다
* 현재 노드까지의 결과가 곧 정답이 되는 경우 : 정답을 리턴한다
- 현재 노드에서 더 진행해야 결과가 나오는 경우 : 각 child들에 대해 함수를 재귀호출한다.
n by n 크기의 체스판이 있다고 하자. 이때 n개의 Queen을 서로 "공격하지 못하도록" 체스판 위에 위치시키고자 한다. (Queen은 앞, 뒤, 좌우, 대각선의 8방향으로 무한정 이동할 수 있다).
예를 들어, 4 * 4 체스판 위에 4개의 Queen을 위치시키는 방법에는 다음의 방법이 존재한다.
. Q . .
. . . Q
Q . . .
. . Q .
몇 번 시행착오를 겪어 보면 알겠지만, 결국 Queen은 모든 행, 모든 열에 각각 하나씩만 위치하게 된다.
위의 과정을 pseudo code로 나타내면 아래와 같다.
n개의 item을 이용하여, item의 무게의 합이 W가 되는 부분집합을 구하는 문제
예시) w1 = 2, w2 = 4, w3 = 5, W = 6인 경우, {w1, w2}의 유일한 정답을 가진다.
우선, item 들을 무게가 증가하는 순으로 정렬한다. 이렇게 하면 현재까지의 결과가 유망한지 아닌지를 쉽게 판단할 수 있게 된다. 가령, 현재 현재까지의 상태에서 남은 무게가 10인데 바로 다음 item의 무게가 12인 경우, 그 뒤의 item들은 볼 것도 없이 현재 상태는 유망하지 못하다. 이때 현재 상태가 유망한지 아닌지는 아래의 기준을 통해 정해진다.
문제 해결 과정을 Space-State Tree (상태공간트리)로 나타낼 때, 문제풀이의 진행 과정은 이 Tree에 대한 Depth-First-Search 순서와 유사하다.
지도를 M가지 색을 이용하여 서로 겹치지 않게 색칠하자
그래프로 변환된 경우, 그래프 구조를 행렬로 표현할 수 있다.
매우 간단한데, 서로 연결되어 있으면서 같은 색인 관계가 존재하는 경우 유망하지 않다
W : 그래프 구조를 나타내는 행렬이다. 각 원소는 Bool이며, W[i][j]는 i노드와 j노드가 서로 연결되어 있는지의 여부를 나타낸다.
vcolor : 각 노드의 색상을 나타내는 1차원 배열이다. vcolor[i]는 i번째 노드의 색상을 의미한다.
m : 문제에서 주어진 색상의 수를 의미한다. m = 4인 경우 그 유명한 4색 문제가 된다.
이를 토대로 아래의 코드를 보자.