题的思路并不难,把递归程序写出来,根据汉诺塔扩展一下就行了,可以很容易找到规律 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;
}