解题步骤:
第一步:
把n-1个模块 从塔 A 移动到塔 B
把第n个模块 从塔 A 移动到塔 C
第二步
把n-1个模块 从塔 B 移动到塔 C
代码:
#include<bits/stdc++.h>
using namespace std;
void hannoi(int n, char A, char B, char C)// 把A盘里面的圆圈转移到C盘里面【A--C】。
{
if (n == 1)
{
cout << "移动圆圈" << n << "从盘" << A << "到盘" << C << endl;//把最后一个圆环从起点盘移动到目标盘。
}
else
{
hannoi(n - 1, A, C, B);// 把N-1个圆环从起点盘移动到(当前)没有任何圆环的过度盘;通过B、C盘在此函数调用中调用位置的互换,来实现把N-1个圆环从A盘到B盘的转移【A--B】。
cout << "移动圆圈" << n << "从盘" << A << "到盘" << C << endl;//把第n个盘从A移动到C
hannoi(n - 1, B, A, C);// 把N-1个圆环从国度盘移动到目标盘(模仿1和2的操作方法来实现);通过A、B盘在此函数调用中位置的互换,来实现N-1个圆环从B盘到C盘的转移【B--C】。
}
}
int main()
{
int n;
cin >> n;
hannoi(n, 'a', 'b', 'c');
system("pause");
return 0;
}
NUST2009-6改:汉诺塔盘子每移动一步需要一秒,输入盘子数n,输出每一步的操作以及共需要多少年,多少天,多少小时,多少分钟,多少秒完成。
#include<bits/stdc++.h>
using namespace std;
static int sum = 0;
void hannoi(int n, char A, char B, char C)// 把A盘里面的圆圈转移到C盘里面【A--C】。
{
if (n == 1)
{
sum++;
cout << "移动圆圈" << n << "从盘" << A << "到盘" << C << endl;//把最后一个圆环从起点盘移动到目标盘。
}
else
{
hannoi(n - 1, A, C, B);// 把N-1个圆环从起点盘移动到(当前)没有任何圆环的过度盘;通过B、C盘在此函数调用中调用位置的互换,来实现把N-1个圆环从A盘到B盘的转移【A--B】。
sum++;
cout << "移动圆圈" << n << "从盘" << A << "到盘" << C << endl;
hannoi(n - 1, B, A, C);// 把N-1个圆环从国度盘移动到目标盘(模仿1和2的操作方法来实现);通过A、B盘在此函数调用中位置的互换,来实现N-1个圆环从B盘到C盘的转移【B--C】。
}
}
int main()
{
int n;
int year, day, hour, mins, second;
cin >> n;
hannoi(n, 'a', 'b', 'c');
year = sum / (365 * 24 * 3600);//求年
sum = sum - 365 * 24 * 3600 * year;//剩余秒数
day = sum / 86400;//求天数,一天3600*24=86400秒
sum = sum - 86400 * day;//剩余秒数
hour = sum / 3600;//求小时
sum = sum - 3600 * hour;//剩余秒数
mins = sum / 60;//求分钟
second = sum - 60 * mins;//秒数
cout << endl << "用时:" << year << "年" << day << "天" << hour << "小时" << mins << "分钟" << second << "秒" << endl;
return 0;
}
问题与总结
1.错误 1 error C2872: “count”: 不明确的符号
因为没想到是count这个变量命名的原因,所以也没往这方面查。
代码如下,一直提示
错误 1 error C2872: “count”: 不明确的符号
错误 2 error C2872: “count”: 不明确的符号
全局变量命名方式本身没错,错在使用了与命名空间重复的命名std::count,换成sum就完全没问题了。以后千万要注意这个问题。
2.递归次数的计算
对于这种计算递归调用次数一定要思路清晰,最好是将所有的递归调用都递归到递归出口的
地方再统一进行递归出口的调用,这样不容易造成紊乱,个人意见,仅供参考。