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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU - 1584 蜘蛛牌(dfs+最优性剪枝)

發(fā)布時間:2024/4/11 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU - 1584 蜘蛛牌(dfs+最优性剪枝) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接:點擊查看

題目大意:給出10張牌,隨機分布在1~10十個不同的位置,要求模擬蜘蛛紙牌的游戲規(guī)則,問移動的最短距離之和是多少

題目分析:我們可以直接dfs搜索,但需要想清楚該怎么搜索,這個題目有點貪心的思想,因為要求移動距離之和最小,所以我們應(yīng)該盡量避免多余的移動,簡單來說,我們只需要將當(dāng)前牌放置到比當(dāng)前牌序號大1的牌上就行,說起來可能有些抽象,舉個例子,牌1只需要移動到牌2上即可,不需要移動到牌3上然后再移動到牌2上之類的,相對的,牌10的位置就固定了,因為牌10在哪里都一樣。

然后就是搜索了,因為不一定是按照順序來的,不一定是牌1放到牌2上,然后牌2帶著牌1放到牌3上,也可能是牌2先放到牌3上,然后牌1再放到牌2上等等等等,所以我們在搜索時,第一層for需要枚舉所當(dāng)前輪次所需要移動的牌,然后第二層for需要尋找比當(dāng)前牌序號大1的牌的位置,然后放上去即可,一開始我就是不太會處理第二層for循環(huán),以為單純的用i+1來判斷就行,果不其然的WA了一發(fā),其實可以換個思想,比如我們已經(jīng)將牌4放到牌5上了,那么我們接下來需要將牌3放到牌4上,我們該處理的距離肯定不是abs(a[3]-a[4])了,因為此時的牌4已經(jīng)到了牌5的位置,所以正確距離應(yīng)該是abs(a[3]-a[5])才對,所以我們的vis數(shù)組保存的是每一堆撲克中最底層的那個牌的大小,并且根據(jù)規(guī)則,我們可以保證這個牌的序號一定是該堆牌中最大的一張,所以我們在尋找目標牌的位置時,只需要在i+1-10中找到第一個在最底層的數(shù)即可,假設(shè)我們找到的目標牌是k,則可以保證第i+1~k張牌已經(jīng)放到了第k張牌的上面

emmm,可能理解起來有點麻煩,但畢竟也是我想了有一個小時才想明白的問題。。直接掛代碼吧,和網(wǎng)上絕大部分的代碼一樣:

#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cstring> #include<algorithm> #include<stack> #include<queue> #include<map> #include<sstream> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=15;int a[N];int ans;bool vis[N];void dfs(int pos,int cnt) {if(cnt>=ans)//最優(yōu)性剪枝return;if(pos==9)//若所有牌的情況都處理完畢,更新結(jié)果{ans=cnt;return;}for(int i=1;i<10;i++)//選擇需要移動的牌{if(!vis[i]){vis[i]=true;for(int j=i+1;j<=10;j++)//找目標牌的位置if(!vis[j]){dfs(pos+1,cnt+abs(a[i]-a[j]));break;}vis[i]=false;}} }int main() { // freopen("input.txt","r",stdin);int w;cin>>w;while(w--){for(int i=1;i<=10;i++){int num;scanf("%d",&num);a[num]=i;}memset(vis,false,sizeof(vis));ans=100;//答案初始化為100,其實到90就行,強迫癥湊個整dfs(0,0);printf("%d\n",ans);}return 0; }

?

總結(jié)

以上是生活随笔為你收集整理的HDU - 1584 蜘蛛牌(dfs+最优性剪枝)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。