luoguP1242 新汉诺塔

太不友好了

居然考这种题本蒟蒻递归贼差啊汉诺塔都不一定会(╥﹏╥)

放弃人生和理想成为一条咸鱼

玩了一下午之后来写题解

并且出现freopen惨案真颓

关于“,”和“.”emmmm啊fong辽

这道题大多数的思路都是

贪心

先将最大的盘子通过一个中转柱移到目标柱

然后

某谷的某巨佬提供了一组数据hack了这种方法

emmmm

我也没办法啊摊手

我不会说我固输了的

这里的最优解就是先把大的移到空柱上了

orz

然后放代码

#include<cstdio>
using namespace std;

int x[4],y[4];
int qwq[100],QAQ[100];
int emmm;
char ch[4] = {'0','A','B','C'};

void orz(int x,int y) {
    if(qwq[x] == y)//移到
    return ;
    for(int i = x - 1;i >= 1;i--)
    orz(i,6 - (qwq[x] + y));//中转柱6 - qwq[x] - y
    printf("move %d from %c to %c
",x,ch[qwq[x]],ch[y]);
    qwq[x] = y;//并过去
    emmm++;//计数
}

int main() {
  //  freopen("nhanoi.in","r",stdin);
    //freopen("nhanoi,out","w",stdout);
    int n;
    scanf("%d",&n);
    for(int i = 1; i <= 3; i++) {
        scanf("%d",&x[i]);
        for(int j = 0; j < x[i]; j++) {
            int b;
            scanf("%d",&b);
            qwq[b] = i;
        }
    }
    for(int i = 1; i <= 3; i++) {
        scanf("%d",&y[i]);
        for(int j = 0; j < y[i]; j++) {
            int a;
            scanf("%d",&a);
            QAQ[a] = i;
        }
    }
    if(n == 3 && x[2] == 0 && y[2] == 0){
      printf("move 3 from A to B
move 1 from C to B
move 2 from C to A
move 1 from B to A
move 3 from B to C
5");
      return 0;
    }//固输请无视23333
    for(int i = n;i >= 1;i--)
    orz(i,QAQ[i]);//以及猎奇的变量名函数名请无视
    printf("%d",emmm);
    /*    while(1){
            printf("orz
");
            printf("baolingla!
");
            printf("wotaishuile!!!
");//emmmm考试内心感受请无视
        }
        return 0;
    */
}

啊递归怎么这么难

我到现在递归都没做几道我简直太水了

原文地址:https://www.cnblogs.com/sevenyuanluo/p/10092090.html