Files
C-Macro-Collections/examples/stack/hanoi.c
T
2019-11-22 00:11:01 -08:00

112 lines
2.1 KiB
C

/**
* hanoi.c
*
* Creation Date: 03/04/2019
*
* Authors:
* Leonardo Vencovsky (https://github.com/LeoVen)
*
*/
#include "cmc/stack.h"
#include <stdio.h>
#include <stdlib.h>
CMC_GENERATE_STACK(s, stack, int);
typedef struct stack stack;
typedef struct stack_iter stack_iter;
void print_hanoi(stack *t1, stack *t2, stack *t3);
const char *draw(int value);
void move_disc(stack *from, stack *to);
void move_stack(stack *t1, stack *t2, stack *t3, size_t size);
int main(int argc, char const *argv[])
{
// 1- Hanoi towers showcase
stack *tower1 = s_new(10);
stack *tower2 = s_new(10);
stack *tower3 = s_new(10);
for (int i = 10; i > 0; i--)
s_push(tower1, i);
move_stack(tower1, tower3, tower2, s_count(tower1));
s_free(tower1, NULL);
s_free(tower2, NULL);
s_free(tower3, NULL);
return 0;
}
void print_hanoi(stack *t1, stack *t2, stack *t3)
{
const int max = 10;
static int step = 0;
printf("Step %d\n", ++step);
for (int i = max - 1; i >= 0; i--)
{
printf(" %10s|%-10s %10s|%-10s %10s|%-10s\n",
draw(t1->buffer[i]), draw(t1->buffer[i]),
draw(t2->buffer[i]), draw(t2->buffer[i]),
draw(t3->buffer[i]), draw(t3->buffer[i]));
}
printf(" ----------------------- ----------------------- -----------------------\n\n");
}
const char *draw(int value)
{
switch (value)
{
case 0:
return "";
case 1:
return "#";
case 2:
return "##";
case 3:
return "###";
case 4:
return "####";
case 5:
return "#####";
case 6:
return "######";
case 7:
return "#######";
case 8:
return "########";
case 9:
return "#########";
case 10:
return "##########";
default:
return "?";
}
}
void move_disc(stack *from, stack *to)
{
s_push(to, s_top(from));
s_pop(from);
}
void move_stack(stack *t1, stack *t2, stack *t3, size_t size)
{
if (size == 0)
return;
move_stack(t1, t3, t2, size - 1);
move_disc(t1, t2);
print_hanoi(t1, t2, t3);
move_stack(t3, t2, t1, size - 1);
}