#include #define size 5 int disk[3][size]; int ndisks[3]; int main() { extern void setup(), move(); setup(); move(); return 0; } void setup() { int i; for (i = 0; i < size; i++) disk[0][i] = size - i; ndisks[0] = size; ndisks[1] = ndisks[2] = 0; } void move() { int do1 = 0, loc1 = 0; int direction = (size % 2) ? 1 : -1; while (ndisks[1] < size) { int from, to; if ((do1 = !do1)) { from = loc1; to = loc1 = (loc1 + direction + 3) % 3; } else { from = (loc1 + 1) % 3; to = (from + 1) % 3; if (!ndisks[from] || ndisks[to] && disk[from][ndisks[from]-1] > disk[to][ndisks[to]-1]) { to = (loc1 + 1) % 3; from = (to + 1) % 3; } } printf("move disk %d from %c to %c\n", disk[from][ndisks[from] - 1], 'A' + from, 'A' + to); disk[to][ndisks[to]++] = disk[from][--ndisks[from]]; } } #if 0 void dump() { int i, j; for (i = 0; i < 3; i++) { printf("[%c]", 'A' + i); for (j = 0; j < ndisks[i]; j++) printf(" %d", disk[i][j]); printf("\n"); } } #endif