Towers of Hanoi: Difference between revisions

→‎{{header|C}}: gratuitous console animation
(→‎{{header|C}}: gratuitous console animation)
Line 159:
move(4, 1,2,3);
return 0;
}</lang>
 
Animate it for fun:<lang c>#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
typedef struct { int *x, n; } tower;
tower *new_tower(int cap, int n)
{
int i = 0;
tower *t = malloc(sizeof(tower) + sizeof(int) * cap);
t->x = (int*)(t + 1);
t->n = 0;
while (i < n) t->x[t->n++] = n - i++;
while (i < cap) t->x[i++] = 0;
return t;
}
 
int height;
tower *t[3];
 
void show_towers()
{
int i, j, k;
printf("\033[H");
for (i = 1; i <= height; i++) {
for (j = 0; j < 3; j++) {
for(k = 0; k <= height - t[j]->x[height - i]; k++)
putchar(' ');
for(; k < height + t[j]->x[height - i]; k++)
putchar('#');
for(; k <= 2 * height; k++)
putchar(' ');
}
putchar('\n');
}
usleep(100000);
}
 
void move(int n, tower *from, tower *to, tower *via)
{
int disk;
if (n) {
move(n - 1, from, via, to);
 
disk = from->x[--from->n];
from->x[from->n] = 0;
to->x[to->n++] = disk;
show_towers();
 
move(n - 1, via, to, from);
}
}
 
int main(int c, char *v[])
{
if (c <= 1 || (height = atoi(v[1])) <= 0) height = 8;
 
t[0] = new_tower(height, height);
t[1] = new_tower(height, 0);
t[2] = new_tower(height, 0);
 
printf("\033[H\033[J");
show_towers();
move(height, t[0], t[2], t[1]);
 
return 0;
}</lang>
 
Anonymous user