1. 程式人生 > >luoguP1242 新漢諾塔

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\n",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\nmove 1 from C to B\nmove 2 from C to A\nmove 1 from B to A\nmove 3 from B to C\n5"); return 0; }//固輸請無視23333 for(int i = n;i >= 1;i--) orz(i,QAQ[i]);//以及獵奇的變數名函式名請無視 printf("%d",emmm); /* while(1){ printf("orz\n"); printf("baolingla!\n"); printf("wotaishuile!!!\n");//emmmm考試內心感受請無視 } return 0; */ }

啊遞迴怎麼這麼難

我到現在遞迴都沒做幾道我簡直太水了