크기가 큰 순서대로 조각을 정렬하여 시작하십시오. 즉 가장 큰 조각이 먼저옵니다. 이제 동일한 조각의 각 시퀀스를 고려하십시오.
현재 크기가 a
인 조각을보고 있다고 가정 해 봅시다. 모든 조각을 탑에 올려 놓으십시오.
다음으로 큰 크기 (크기가 b
이되도록 b < a
)로 이동 한 다음이 시점부터 가능한 모든 타워를 반복적으로 작성하십시오.
타워에 적어도 하나의 크기 a
이 있습니까? 이 경우, 크기 a
의 일 개 부분을 제거하고 2
다음 프로그램은 사용자가 명령 행 조각 입사 ANSI C.이 알고리즘을 구현하는 단계로 리턴한다. 우리는 qsort
을 비교 함수 reverse
으로 호출하여 내림차순으로 입력을 정렬 한 다음 재귀 함수 print_tower
을 호출합니다.
#include <stdlib.h>
#include <stdio.h>
/* Assumes that data is sorted in descending order. */
void print_tower(int *data, int n, int pos, int *result, int len) {
int seek, i;
/* If we're out of data, print the result pieces. */
if (pos == n) {
if (len > 0) {
printf("%d", result[0]);
for (i = 1; i < len; ++i) {
printf(", %d", result[i]);
}
printf("\n");
}
return;
}
/* Scan the sequence of identical elements. */
seek = pos;
while (seek < n && data[seek] == data[pos]) {
result[len++] = data[seek++];
}
/* Recursively print the tower and shorten the sequence. */
while (pos++ <= seek) {
print_tower(data, n, seek, result, len--);
}
}
/* Comparison function to sort integers in descending order. */
int reverse(const void *p, const void *q) {
int a = *(int *)p, b = *(int *)q;
return b - a;
}
int main(int argc, char **args) {
int i, n = argc-1,
*data = (int *) malloc(n*sizeof(int)),
*result = (int *) malloc(n*sizeof(int));
for (i = 0; i < n; ++i) {
data[i] = atoi(args[i+1]);
}
qsort(data, n, sizeof(int), reverse);
print_tower(data, n, 0, result, 0);
return 0;
}
크기로 배열을 정렬하십시오. 그런 다음 (힌트) '왼쪽'요소에 '올바른'배열 요소 만 스택 할 수 있습니다. – usr2564301