题的思路并不难,把递归程序写出来,根据汉诺塔扩展一下就行了,可以很容易找到规律 3 ^ n - 1;。
坑人的地方在于:输入到文件末尾!!!!不读题WA了好多次,下面附上递归过程的代码
#include <stdio.h> #include <iostream> #include <math.h> using namespace std; int ans = 0, n; long long ans2 = 0; void hmove(char a, char b, char c, int n){ if(n == 0){ return ; } hmove(a, c, b, n - 1); //前n - 1块从a移动到b上 printf("%c -> %c\n", a, c); //我自己移动一块从a -> c ans++; //我移动了几次? hmove(b, a, c, n - 1); //最后把 n - 1块从b移动到c上 } //只能先移动到相邻的柱子上 void hmove2(char a, char b, char c, int n){ if(n == 0){ return ; } hmove2(a, b, c, n - 1); //把前n - 1块通过b移动到c上 ans2++; //把最后一块移动到b上 printf("%c -> %c\n", a, b); hmove2(c, b , a, n - 1); //把n - 1 块通过b移动到a上 ans2++; //把最后一块移动到c上 printf("%c -> %c\n", b, c); hmove2(a, b, c, n - 1); //把剩下的n - 1块通过b移动到c上 } int main(){ scanf("%d", &n); printf("普通汉诺塔\n"); hmove('a', 'b', 'c', n); printf("%d\n", ans); printf("本题目汉诺塔\n"); hmove2('a', 'b', 'c', n); printf("%lld\n", ans2); }
附上A的代码
#include <stdio.h> #include <math.h> int main(){ int n; while(scanf("%d", &n) != EOF){ long long ans = pow(3, n) - 1; printf("%lld\n", ans); } return 0; }