日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

新汉诺塔(洛谷P1242)含第11个数据的解决办法

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 新汉诺塔(洛谷P1242)含第11个数据的解决办法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

解析

應該從大到小一個個移,這樣后面大盤就可以直接忽略,保證沒有冗余操作,必定最優(如果先移動小的,后面移動大的時還要動小的)
對于第id個從當前位置到目標的移動有兩種移動方案:
法1:把id-1個移到中轉站,把id移到目標
法2:把id-1個移到id的目標,把id移到中轉站,把id-1個都移到id原位置,把id移到目標
洛谷很多題解都只考慮了第一種方案,但在加入數據11后會被卡掉
法2雖然看起來繁瑣,但其好處是第id-1個會落到id的原位置,當其目標恰好是這個位置,且其原位置在id的目標(這樣法2的第一步就不用處理id-1)時,我們只需要處理一次id-1的移動,而用法1需處理2次,故此時法2更優

代碼

#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int place[50020],now,goal,ans[50020]; int n; char s[10]={'m','A','B','C','f','u','c','k'}; long long tot=0; void move(int id,int to){if(place[id]==to) return;int spj=0;int trans=6-place[id]-to;if(place[id-1]!=to) spj=1;//只有當下一個盤(id-1)目前在id的目標且其目標在id目前的位置時觸發特判 if(ans[id-1]!=place[id]) spj=1;//if(id==1) spj=1; 這行似乎不加也行 if(spj==0){//spj:方法2 for(int i=id-1;i>=1;i--) move(i,to);printf("move %d from %c to %c\n",id,s[place[id]],s[trans]);tot++;place[id]=trans;for(int i=id-1;i>=1;i--) move(i,6-place[id]-to);printf("move %d from %c to %c\n",id,s[place[id]],s[to]);tot++;place[id]=to;return;}//正常:方法1 for(int i=id-1;i>=1;i--) move(i,6-place[id]-to);printf("move %d from %c to %c\n",id,s[place[id]],s[to]);place[id]=to;++tot; } int main(){int num;scanf("%d",&n);for(int i=1;i<=3;i++){scanf("%d",&num);for(int j=1;j<=num;j++){scanf("%d",&now);place[now]=i;}}for(int i=1;i<=3;i++){scanf("%d",&num);for(int j=1;j<=num;j++){scanf("%d",&goal);ans[goal]=i;}}//if(n==3&&place[1]==3&&ans[1]==1){//printf("move 3 from A to B\n");//place[3]=2;//tot++;//}for(int i=n;i>=1;i--){if(place[i]==ans[i]) continue;move(i,ans[i]);}printf("%lld",tot);return 0; }

反數據大全

自己調時洛谷基本都能過(too water。。)
但自己又想到一些反數據卡掉了一些不成熟的想法(基于數據11)
如果洛谷和這些數據你都能過,那么基本沒問題啦~~
(限于篇幅輸出只顯示步數)
case 1
in:
3
1 3
0
2 2 1
2 2 1
0
1 3

out:
5

case 2
in:
4
1 3
1 4
2 2 1
2 2 1
1 4
1 3

out:
5

case 3
in:
3
1 3
0
2 2 1
1 2
1 1
1 3

out:
6

case 4
in:
4
2 4 1
0
2 3 2
3 3 2 1
0
1 4

out:
10

Ending

你又變厲害了呢~~~
祝大家AKNOI,rp++!!

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的新汉诺塔(洛谷P1242)含第11个数据的解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。