먼저 시뮬레이션에 사용할 초기 바구니에 넣을 공의 집합을 생성하는 함수를 작성할게요.
Array * InitSimulation() { int ball = 0; Array *bucket = 0;
먼저 동적 배열을 생성합니다.
bucket = New_Array();
0번 공부터 9번 공까지 순차적으로 이동하면서 배열에 순차 보관합니다.
for(ball = 0; ball<=9; ++ball) {
보관할 자료형이 포인터 형식이 아니므로 강제 형변환하여 보관할게요.
Array_PushBack(bucket,(Element)ball); }
공을 보관한 배열을 반환합니다.
return bucket; }
이제 테스트 코드를 작성합시다.
int main() {
테스트를 위해 스택이 필요하므로 변수를 선언합시다.
EHStack *ehs = 0;
경험 정보도 필요하므로 변수를 선언합시다.
Heuristic *heu = 0;
초기에 공을 보관할 배열을 위한 변수도 선언합니다.
Array *bucket = 0;
알고리즘 내부에서는 현재 경험에서 다음 경험 목록을 조사해야 합니다. 이 때 다음 경험 목록을 보관할 배열이 필요하므로 이를 위한 변수도 선언합시다.
Array *next_heus = 0;
조사한 경험 목록을 순차적으로 방문해야 하므로 반복자도 선언합시다.
Iterator seek=0, end=0;
먼저 바구니에 담을 공의 집합을 동적으로 생성하는 InitSimulation 함수를 호출합니다.
bucket = InitSimulation();
순열 알고리즘 테스트 코드를 작성하기 전에 동적 알고리즘을 다시 한 번 살펴봅시다.
동적 알고리즘
초기 경험 정보를 생성
스택에 초기 경험 정보 Push
반복(스택이 빌 때까지)
스택에서 경험 정보를 Pop
꺼낸 온 경험에서 발생할 수 있는 다음 경험 정보 조사
반복(다음 경험 정보들을 순차적으로)
조건(결과에 도달하지 않았다면)
스택에 경험 정보를 Push
그렇지 않다면
결과에 보관
먼저 스택을 생성합니다.
ehs = New_EHStack();
초기 경험 정보를 생성하고 이를 스택에 보관합니다.
heu = MakeInitHeuristic(bucket); EHStack_Push(ehs,heu);
스택이 빌 때까지 반복합니다.
while( ! EHStack_IsEmpty(ehs) ) {
스택에서 경험 정보를 꺼내옵니다.
heu = (Heuristic *)EHStack_Pop(ehs);
현재 경험정보에서 다음 경험 정보를 조사합니다. 이를 위해 다음 경험 정보를 보관할 동적 배열도 생성합니다.
next_heus = New_Array(); FindNextHeuristics(heu,next_heus);
조사한 다음 경험 정보의 시작과 끝을 얻어옵니다.
seek = Array_Begin(next_heus); end = Array_End(next_heus);
순차적으로 이동하면서 다음 경험 정보를 참조합니다.
for(seek=seek; seek != end; ++seek) { heu = (Heuristic *)(*seek);
만약 결론에 도달했다면 이를 출력하고 동적 경험 정보를 소멸할게요. 여기에서는 3개의 공을 꺼냈을 때 결론에 도달한 것으로 할게요.
if(GetOutCount(heu) == 3) { ViewHeuristic(heu); DeleteHeuristic(heu); }
결론에 도달하지 않으면 다시 스택에 보관합니다.
else { EHStack_Push(ehs,heu); } }
다음 경험 정보를 보관했던 동적 배열을 소멸합니다.
Delete_Array(next_heus); }
시뮬레이션에 사용한 버켓과 스택을 소멸합니다.
Delete_Array(bucket); Delete_EHStack(ehs); return 0; }
출력 결과가 하나의 콘솔 화면의 범위를 벗어나서 확인하기 까다롭다면 콘솔 명령 화면에서 다음과 같이 실행해 보세요.
[그림 6.4]처럼 콘솔 명령어를 사용하면 >> 뒤에 명시한 파일로 출력합니다. 결과 파일을 더블 클릭하여 원하는 모든 결과를 출력하는지 확인해 보세요.