梁帅
(荣幸之至)
1
题目描述:
著名的汉诺塔问题:
有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆环,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至B杆:
1.每次只能移动一个圆盘;
2.大盘不能叠在小盘上面。
解决这类问题有以下方案:
现在假设我们要将 t 个盘子从柱子 x 放到柱子 y,则我们可以先想办法把上面的 t-1个盘子放到另一个柱子上,然后将最大的盘子放到y上,最后将那t-1个盘子放到第 y 个柱子上。那么移动 t-1 个盘子就变成了一个子问题。
给定 n ,求问:按照上述策略,依次输出进行了那些操作。
输入格式:
一个正整数 n
输出格式:
若干行,表示操作。
格式见样例。
样例输入1:
2
样例输出1:
A->C A->B C->B
约定:
1<=n<=10
样例都没过

代码:
#include <bits/stdc++.h>
using namespace std;
int n;
void f(int, char, char, char);
int main()
{
scanf("%d", &n);
dfs(n, 'A', 'B', 'C');
return 0;
}
void f(int n, char x, char y, char z)
{
if (n == 0)
{
return;
}
f(n - 1, x, z, y);
printf("%c->%c\n", x, z);
f(n - 1, y, x, z);
}
3 个赞
谢晨泽
(苦力怕)
7
你的代码:
#include <bits/stdc++.h>
using namespace std;
int n;
void f(int, char, char, char);
int main()
{
scanf(“%d”, &n);
dfs(n, ‘A’, ‘B’, ‘C’);
return 0;
}
void f(int n, char x, char y, char z)
{
if (n == 0)
{
return;
}
f(n - 1, x, z, y);
printf(“%c->%c\n”, x, z);
f(n - 1, y, x, z);//*
}
问题在*行,返回时是z,y,x
1 个赞
梁帅
(荣幸之至)
8
#include <bits/stdc++.h>
using namespace std;
int n;
void f(int, char, char, char);
int main()
{
scanf("%d", &n);
f(n, 'A', 'B', 'C');
return 0;
}
void f(int n, char x, char y, char z)
{
if (n == 0)
{
return;
}
f(n - 1, x, z, y);
printf("%c->%c\n", x, z);
f(n - 1, z, y, x);
}
@谢晨泽 还是WA0。
1 个赞
黄新宇
(雨宫莲)
9
#include <bits/stdc++.h>
using namespace std;
int n;
void f(int, char, char, char);
int main()
{
scanf(“%d”, &n);
f(n, ‘A’, ‘C’, ‘B’);
return 0;
}
void f(int n, char x, char y, char z)
{
if (n == 0)
{
return;
}
f(n - 1, x, z, y);
printf(“%c->%c\n”, x, z);
f(n - 1, y, x, z);
}
因当是这样,
其中的一个粗体字是要将‘B’和‘C’的位置互换
第二个是将z,y,x换成y,x,z
2 个赞