[C언어 알고리즘] 6.1.3 순열 알고리즘 테스트 코드 작성
먼저 시뮬레이션에 사용할 초기 바구니에 넣을 공의 집합을 생성하는 함수를 작성할게요.
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.3] 콘솔 명령어에서 파이프 사용
[그림 6.3]처럼 콘솔 명령어를 사용하면 >> 뒤에 명시한 파일로 출력합니다. 결과 파일을 더블 클릭하여 원하는 모든 결과를 출력하는지 확인해 보세요.
'언어 자료구조 알고리즘 > 디딤돌 알고리즘 (C언어)' 카테고리의 다른 글
[C언어 알고리즘] 6.2.3 그래프 테스트(DFS 알고리즘에 사용할 그래프) (0) | 2016.12.01 |
---|---|
[C언어 알고리즘] 6.2.2 그래프 구현(DFS 알고리즘에 사용할 그래프) (0) | 2016.12.01 |
[C언어 알고리즘] 6.2.1 그래프 설계(DFS 알고리즘에 사용할 그래프) (0) | 2016.12.01 |
[C언어 알고리즘] 6.2 깊이우선탐색(DFS) 알고리즘 (0) | 2016.12.01 |
[C언어 알고리즘] 6.1.4 순열 알고리즘 소스 코드 (0) | 2016.12.01 |
[C언어 알고리즘] 6.1.2 순열 알고리즘의 경험 정보 구현 (0) | 2016.12.01 |
[C언어 알고리즘] 6.1.1 순열 알고리즘의 경험(Heuristic)정보 설계 (0) | 2016.12.01 |
[C언어 알고리즘] 6.1 순열 알고리즘 (0) | 2016.12.01 |
[C언어 알고리즘] 6.동적 프로그래밍 (0) | 2016.12.01 |
[C언어 알고리즘] 5.4 인접 행렬로 표현한 그래프 소스 코드 (0) | 2016.12.01 |