//三柱
#include
#include
int min = 0;
void hanoi(int n, char ch1, char ch2, char ch3)
{
if(n == 1)
{
printf("%c->%c\n", ch1, ch3);
min++;
//return;
}
else
{
hanoi(n - 1, ch1, ch3, ch2);//把n-1个盘从1柱借助3柱移到2柱
printf("%c->%c\n", ch1, ch3);
min++;
hanoi(n - 1, ch2, ch1, ch3);
}
}
int main(void)
{
int n;
printf("请输入盘子的个数:\n");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
printf("最少步数是%d\n", min);
system("pause");
}
四柱汉诺塔思路:假设把 n 个盘从 1 柱(借助2、3柱)移到 4 柱所需最少步数为 f (n)
1、那么我们把 x 个盘从 1 柱(借助3、4柱)移到 2 柱所需最少步数就是 f (x)
2、把 n - x 个盘从 1 柱(借助 3 柱)移到 4 柱所需最少步数是 2^(n-x) - 1,这个需要证明,但我不会
3、把 2 柱上的 x 个盘(借助1、3柱)移到 4 柱所需最少步数为 f (x)
4、那么把 x 从 1 到 n - 1 遍历一遍,找出 f (n)最小时的 x
//四柱
#include
#include
#include
int num[65];//存放对于不同n当取最小步数时从一柱先移走的数量x
void hanoi3(int n, char ch1, char ch2, char ch3)
{
if(n == 1)
{
printf("%c->%c\n", ch1, ch3);
//return;
}
else
{
hanoi3(n - 1, ch1, ch3, ch2);
printf("%c->%c\n", ch1, ch3);
hanoi3(n - 1, ch2, ch1, ch3);
}
}
void hanoi4(int n, char ch1, char ch2, char ch3, char ch4)
{
if(n == 1)
{
printf("%c->%c\n", ch1, ch4);
//return;
}
else if(n == 2)
{
printf("%c->%c\n%c->%c\n%c->%c\n", ch1, ch2, ch1, ch4, ch2, ch4);
//return;
}
else
{
hanoi4(num[n], ch1, ch3, ch4, ch2);//先从1柱上移走num[n]个盘,借助3、4柱移到2柱上
hanoi3(n - num[n], ch1, ch3, ch4);//2柱上有盘,不能借用
hanoi4(num[n], ch2, ch1, ch3, ch4);
}
}
int main(void)
{
int i, n, x, f[65], min;//f[n]存放盘总数为n时的最小步数
f[0] = 0; f[1] = 1; f[2] = 3;
printf("请输入盘子的个数:\n");
scanf("%d", &n);
for(i = 3; i < 65; i++)
{
min = INT_MAX;
for(x = 1; x < i; x++)
{
if(2 * f[x] + pow(2.0, i - x) - 1 < min)//虽然中间值会溢出,但不影响结果
{
min = 2 * f[x] + pow(2.0, i - x) - 1;
num[i] = x;
}
}
f[i] = min;
}
printf("最少步数是%d\n", f[n]);
if(n)
hanoi4(n, 'A', 'B', 'C', 'D');//输出每步
system("pause");
}