luoguP1242 新漢諾塔
阿新 • • 發佈:2018-12-09
太不友好了
居然考這種題(本蒟蒻遞迴賊差啊漢諾塔都不一定會(╥﹏╥)
放棄人生和理想成為一條鹹魚
玩了一下午之後來寫題解
唉
並且出現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; */ }
啊遞迴怎麼這麼難
我到現在遞迴都沒做幾道我簡直太水了