Code:
#include <stdio.h>
#include <conio.h>
//#include <dos.h>
#include <windows.h>
HANDLE g_hConsol = GetStdHandle(STD_OUTPUT_HANDLE);
void gotoxy(const int x, const int y)
{
COORD coord = {x, y};
SetConsoleCursorPosition(g_hConsol, coord);
}
void clrscr()
{
COORD ZEROPOINT={0,0};
DWORD written;
FillConsoleOutputCharacter (GetStdHandle
(STD_OUTPUT_HANDLE), ' ',
2000, ZEROPOINT, &written);
gotoxy (1, 1);
}
typedef unsigned int uint;
//#define NUMB_OF_ELEM 10
//int towers[NUMB_OF_ELEM][3];
void main2() {
//int NUMB_OF_ELEM = 10;
//int z;
//scanf ("%d", &z);
#define NUMB_OF_ELEM 6
}
int towers[NUMB_OF_ELEM][3];
void prnt()
{
int j, k, posx, posy;
int i;
clrscr();
for(j = 0; j < 3; j++) {
for(i = NUMB_OF_ELEM-1; i >= 0; i--) {
posy = 20 - i;
posx = 20 + (j * 20);
for(k = 1; k <= towers[i][j]; k++) {
gotoxy(posx-k, posy);
putch('-');
gotoxy(posx+k, posy);
putch('-');
}
gotoxy(posx, posy);
if(towers[i][j])
printf("%d", towers[i][j]);
else
putch('|');
}
}
}
void move(uint s1, uint dst)
{
int i, is, id;
for(i = NUMB_OF_ELEM-1; i >= 0; i--) {
if(towers[i][s1]) {
is = i;
break;
}
}
for(i = 0; i < NUMB_OF_ELEM; i++) {
if(!towers[i][dst]) {
id = i;
break;
}
}
towers[id][dst] = towers[is][s1];
towers[is][s1] = 0;
prnt();
gotoxy(1,1);
printf("Move disk %u from %u to %u.", towers[id][dst], s1, dst);
getch();
}
int mover(uint p1, uint s1, uint dst)
{
int i, is, id;
for(i = NUMB_OF_ELEM-1; i >= 0; i--) {
if(towers[i][s1]) {
is = i;
break;
}
}
for(i = NUMB_OF_ELEM-1; i >= 0; i--) {
if(towers[i][dst]) {
id = i;
break;
}
}
return (towers[is][s1] == p1)
&& ((towers[0][dst] == 0)
|| towers[id][dst] > towers[is][s1]);
}
uint o1(uint p1)
{
int i, j;
for(j = 0; j < 3; j++) {
for(i = NUMB_OF_ELEM-1; i >= 0; i--) {
if(towers[i][j] == p1) {
return j;
}
}
}
return -1;
}
void ranoi(uint n, uint s1, uint dst)
{
uint i, j, jog = 0, s2, dtemp, p1,auxtemp;
int t1 = 1;
if(s1 > 2 || dst > 2 || s1 == dst || n == 0)
return;
for(i = 0; i < n; i++) {
jog = (2 * jog) + 1;
}
if((n % 2) == 0)
t1 = -1;
p1 = 1;
for(i = 0; i < jog; i++) {
s2 = o1(p1);
if(p1 % 2) {
dtemp = ((3 + s2) + t1) % 3;
} else {
if(mover(p1, s2, (s2 + 1)%3))
dtemp = (s2 + 1)%3;
else
dtemp = (s2 + 2)%3;
}
move(s2, dtemp);
p1 = (p1 % n) + 1;
s2 = o1(p1);
while(!mover(p1, s2, (s2 + 1)%3) && !mover(p1, s2, (s2 + 2)%3)) {
p1 = (p1 % n) + 1;
s2 = o1(p1);
}
}
}
int main()
{
main2();
uint i, j, s1 = 0, dst = 1;
for(j = 0; j < 3; j++) {
for(i = 0; i < NUMB_OF_ELEM; i++) {
if(j == s1)
towers[i][j] = NUMB_OF_ELEM - i;
else
towers[i][j] = 0;
}
}
prnt();
gotoxy(1,1);
printf("Press any key", s1, dst);
getch();
ranoi(NUMB_OF_ELEM, s1, dst);
gotoxy(1,1);
printf("Ready!", s1, dst);
getch();
return 0;
}
