티스토리 뷰

1. 개요



[그림 1] 백 트래킹(Backtracking) 과정


 백트래킹의 주요 개념은 해를 얻을 때까지 모든 가능성을 시도하는 기법이다. 모든 가능성은 하나의 트리처럼 구성할 수 있으며, 가지 중에서 해결책을 찾는다. 탐색 중에 오답을 만나면 이전 분기점으로 돌아가고 시도해보지 않은 다른 해결 방법이 있으면 시도한다. 여러 시도중 해결 방법이 더이상 없으면 더 이전의 분기점으로 돌아가고 모든 트리의 노드를 검사해도 답을 찾지 못할 경우, 이 문제의 해결책은 없는 것으로 간주한다.


1. 어떤 노드의 유망성을 점검한 후에 유망(Promising)하지 않다고 결정되면 그 노드의 부모로 돌아가 (backtracking) 다음 자식 노드로 감


2. 어떤 노드를 방문하였을 때 그 노드를 포함한 경로가 해답이 될 수 없다면 그 노드는 유망하지 않다고 하며, 반대로 해답의 가능성이 있으면 유망하다고 한다.


3. 가지치기 (pruning) : 유망하지 않는 노드가 포함되는 경로는 더 이상 고려하지 않는다.




2. 백트래킹 예제 1 - 보글게임




[그림 2] 보글게임



N X M 크기의 알파벳 격자에서 상하좌우 / 대각선 으로 인접한 칸들의 글자들을 이어서 단어를 찾아내는 게임


※ 입력 : 정수 N,M은 1<= N <= 100, 1<= M <= 1000의 크기를 갖는다.


1. main()


FILE 입출력 함수를 이용해 단어가 저장된 텍스트파일을 불러오고 검색할 단어 배열을 선언
반복문을 이용해 보드 2차원배열에 텍스트파일 하나씩 저장한다.

2. 판 초기화 및 게임구동 함수

 

 3. 단어 찾기 ( 백트래킹 )

재귀호출을 사용하여 구현하였다. 기본부분 (Base Part) 는 종결 조건이 3가지 이므로 3개를 설정했다. 하나는 시작위치가 판의 범위의 벗어났을 때 하나는 Word 문자열의 첫 글자가 현재 x,y좌표랑 일치하지 않을 경우 마지막 하나는 단어의 길이가 1이면 TRUE를 리턴하면서 종료하는 것이다. 
단어의 길이가 1인 이유는 만약 Word문자열의 첫 글자가 x,y좌표랑 일치하여 팔방재귀를 하면서 다음 검사를 하게된다고 하자 
[그림 2]를 예로들면 찾는 단어가 "PRETTY" 이므로 Word문자열의 첫 글자는 1행 4열의 "P"가 될 것이다. 그림에서는 2행 2열의 "P"가 빨간색으로 돼있지만 이 코드에서는 팔방재귀 즉, 대각선도 검사하므로 1행 4열의 "P"가 선택이 될 것이고 다음 2행 3열의 R ... 2행 4열의 E..이런식으로 재귀호출시 전달인자로 Word배열 + 1 을 주어서 단어의길이가 1이 될때 종료를 시킨다. 



3. 백트래킹 예제 2 - N Queen



[그림 3] N Queen 문제



N * N 체스 보드판에 N개의 queen을 서로 공격하지 못하도록 배치하는 방법을 찾아내는 문제.


입력 : 정수 n을 입력한다  ( 1<=N<=15 )


출력 : 서로 총 경우의 수를 출력한다.


[해결법]


이 문제를 풀기위해선 퀸의 공격범위에 대해 생각을 해야한다.

퀸이 공격할수 있는 루트는 상하좌우/대각선 이동이 가능하고 판의 끝까지 갈 수 있다. 따라서 생각해보면 한 행에 하나 이상의 퀸을 놓을 수 없다는 성질, 예를들어 4*4 의 체스판에서 화살표가 지나간 칸에는 퀸을 놓을 수 없다는 성질을 고려한다.



[그림 4] 4*4판에서의 퀸의 공격방향




1. 첫 번째 행, 첫 번째 열에 퀸을 놓는다.

2. 다음 행에서 가능한 가장 왼쪽 열에 퀸을 놓는다.

3. N번째 열에 더 이상 퀸을 놓을 수 없다면 백트랙 한다.

4. 마지막 행에 퀸을 놓으면 하나의 해를 구한 것이다.

5. 모든 경우를 조사할 때까지 백트래킹하며 해를 구함.


행은 검사할 필요가 없으므로, 열과 대각선만 검사하면 된다. 열을 검사하는 방법은 크기가 N 인 체크 배열을 만들어 K번째 열에 퀸을 놓았다면 배열의 K번째 위치를 체크하여 이후의 행에서는 체크된 열에 퀸을 놓지않게 한다.

열과 마찬가지로 대각선도 체크배열을 통해 판별한다.



첫번째로 1행1열에 퀸을 놓고 
열 체크배열 1번방에 체크 , 증가대각선 체크배열 (1 + 1) = 2 번방에 체크, 감소대각선 체크배열 ( n=4  + (1-1) ) = 0번 방에 체크한다
다음 행을 하나 증가시켜 재귀호출을 하며 똑같은 과정을 반복한다.

4*4판의 경우 1행1열에 퀸을 놓았을때는 해가 안나온다 따라서 백트랙,백트랙 하여 이전에 체크했던 내용을 삭제하고 맨 처음으로 돌아가
2행 1열에 퀸을 놓으면서 다시 시작한다.

[출력 예시]



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함