main函数中输入移动汉诺塔的个数,最多不超过10个
#include<stdlib.h>
#include<stdio.h>
#include<Windows.h>
int a[10][3]={0};
void hannuo(int n,char A,char B,char C);//移动的过程
void show(int a[10][3]);//显示的作用
void move(char X,char Y);//移动,链接数据到视图
int main()
{
int n=0;
scanf("%d",&n);
for(int i=0;i<n;i++) //布局
{
a[10-1-i][0]=n-i;//操作第一列 循环操作行, 第一行就是10-1,第i行就是10-1-i
}
show(a);//传递a
Sleep(1000);
hannuo(n,'A','B','C');
return 0;
}
void show(int a[10][3])
{
printf("%5c%5c%5c\n",'A','B','C');
printf("---------------------\n");//分隔符
for(int i=0;i<10;i++)//显示
{
for(int j=0;j<3;j++)
{
printf("%5d",a[i][j]);//遍历输出现在的状态
}
printf("\n"); // 输出一行就 换行
}
}
void hannuo(int n,char A,char B,char C)
{
//A B C
//0
//1
//2
//2 1
// 1 2
// 1
// 2
//以上是两个汉诺塔的移动过程,如果是三个
//1
//2
//3
//把1,2绑定起来作为一,3作为二,那么递归调用上层两个汉诺塔的移动,算法就实现三个
//N个移动要调用第N-1个移动,通过递归实现
if(n<1)
{
return;
}
else if(n==1)
{
printf("\n%c->%c\n",A,C); // move函数做好了再做下一步,这一步只是说要移动的东西
move(A,C);
show(a);
}//简单的情况考虑了 下面来复杂的
else
{
//N个汉诺
//A B C
//N-1
//N
//N N-1 第一步N-1从A移动到B
// N-1 N
// N-1
// N
hannuo(n-1,A,C,B);//A->B 递归,由于最简单的情况他只能执行A与C的交换,所以这里把A,B放入A,C的位置
Sleep(1000);
printf("\n%c->%c\n",A,C);//直接移动A到C
Sleep(1000);
move(A,C);
Sleep(1000);
show(a);
Sleep(1000);
hannuo(n-1,B,A,C);//B移动到C
}
}
void move(char X,char Y)
{ //A B C
//0
//1
//2
//3
//4 0
// 0与1交换
//0
//0
//2
//3
//4 1
int m=X-65;//[9][m] A---- m=0
int n=Y-65;//[9][n] C---- n=2
int imove=-1;//找到第一个不为0的数,即为第一个汉诺塔盘片
for (int i=0;i<10;i++)
{
if(a[i][m]!=0)
{
imove=i;
break;//找到第一个不为0的数
}
}
//需要的移动a[imove][m]
//找到a[jmove][n]
int jmove;
if(a[9][n]==0)//最后一个为0
{
jmove=9;
}
else
{
jmove=10;
for(i=0;i<10;i++)
{
if(a[i][n]!=0)//检索第一个不为0
{
jmove=i; // 与检测imove第一个不为0的数一样,但是要移动的是这个不为0上面的0
break;
}
}
jmove-=1;
}
int temp=a[imove][m];
a[imove][m]=a[jmove][n];
a[jmove][n]=temp;
}