// Hanoi.cpp : Defines the entry point for the console application.
//
#include
#include "stdio.h"
#include "iostream.h"
char c1[10][19],c2[10][19],c3[10][19];//存放状态,真实模拟三个塔座。
int MAX=0;
int number=3;//3阶汉诺塔
void draw()//输出三个塔座的信息
{
char c;
cout<<"按键后回车进行下一步"<>c;//输入任意字符,此处的作用是用来手动控制移动,输入一个字符,移动一次。
int j=0;
int i=0;
for(;i<=9; i++)
{
for(j=0; j<19; j++)
{
printf("%c",c1[i][j]);
}
printf("%s"," ");
for(j=0; j<19; j++)
{
printf("%c",c2[i][j]);
}
printf("%s"," ");
for(j=0; j<19; j++)
{
printf("%c",c3[i][j]);
}
printf("\n");
}
printf("------------------- ------------------- -------------------\n\n");
}
void move(char x[10][19],char y[10][19])//把x塔座最上面一个移动到y塔座的最上面
{
MAX++;//控制移动次数加1
int first=0;
int second=0;
for(int i=0;i<10;i++)//从上到下来找
{
if(x[i][8]=='*')//x塔座出现第一行的位置
{
first=i;
break;
}
}
for(i=9;i>=0;i--)//从下向上来找
{
if(y[i][8]!='*')//y塔座第一行上面的位置
{
second=i;
break;
}
}
for(i=0;i<19;i++)
{
y[second][i]=x[first][i];//移动,将x塔座最上面一层移动到y塔座最上面
if(i==9)//给x塔座的i层清空。
x[first][i]='|';
else
x[first][i]=' ';
}
draw();
}
void hanoi(int n,char one[10][19],char two[10][19],char three[10][19])//汉诺塔原理,递归实现
{//将one塔座上的移动到three塔座上,第一步是将one塔座上的n-1个移动到two塔座,第二步将one塔座上的第n个移动到three塔座上,
//第三步将two塔座上的n-1个移动到three塔座上。
if(n==1)
move(one,three);
else
{
hanoi(n-1,one, three, two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
void main()
{
int j=0;
int i=0;
for(;i<10;i++)
{
for(j=0;j<19;j++)
{
if(j==9)
{
c1[i][j]='|';
c2[i][j]='|';
c3[i][j]='|';
}
else
{
if( i >= 10-number)//共有number阶
{
int i1=i+number-10+1;
if(j>=9-i1&&j<=9+i1)
c1[i][j]='*';
else
c1[i][j]=' ';
}
else
{
c1[i][j]=' ';
c2[i][j]=' ';
c3[i][j]=' ';
}
}
}
}
draw();
hanoi(number,c1,c2,c3);
printf("一共进行次数为:%d\n",MAX);
}