汉诺塔问题目标:把A上的‘盘子’全部移动到C上,每次只能移动一个,而且移动过程中小‘盘子’只能在大‘盘子’上面。
要用递归解决该问题就需要找到
f
(
n
)
f(n)
f(n)与
f
(
n
−
1
)
f(n-1)
f(n−1)的关系
f
(
n
)
f(n)
f(n)即将n个‘盘子’从A移动到C
f
(
n
)
f(n)
f(n)可以分解为:
① n-1个 ‘盘子’从A移动到B
②第n个‘盘子’从A移动到C
③ n-1个‘盘子’从B移动到C
构造函数:
输入为塔中‘盘子’的个数,以及三个位置,因为n-1个‘盘子’的起始位置与目标位置与n个‘盘子’的是不一样的。
定义:
int a[10][3] = { 0 };
用于保存汉诺塔图像数组
void hanno(int n, char A, char B, char C)
{
if (n < 1)
{
return;
}
else if (n == 1)
{
printf("%c -> %c\r\n", A, C);//直接
move(A, C);
show(a);
}
else
{
hanno(n - 1, A, C, B);//A->B
printf("%c -> %c\r\n", A, C);//直接
move(A, C);
show(a);
hanno(n - 1, B, A, C);//B->C
}
}
用于处理f(n)与f(n-1)的递归关系
void show(int a[10][3])
{
printf("%5c%5c%5c\r\n", 'A', 'B', 'C');
printf("--------------------\r\n");
for (int i = 0;i < 10; i++)
{
for (int j = 0;j < 3;j++)
{
printf("%5d", a[i][j]);
}
printf("\n");
}
}
用于显示汉诺塔移动图像
void move(char X, char Y)
{
int m = X - 65;
int n = Y - 65;
int imove = -1;
for (int i = 0;i < 10;i++)
{
if (a[i][m] != 0)
{
imove = i;
break;
}
}
int jmove = 0;
if (a[9][n] == 0)
{
jmove = 9;
}
else
{
for (int i = 0;i < 10;i++)
{
if (a[i][n] != 0)
{
jmove = i;
break;
}
}
jmove -= 1;
}
int temp = a[imove][m];
a[imove][m] = a[jmove][n];
a[jmove][n] = temp;
}
移动数组中的‘盘子’