日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

IDA*-洛谷P1379 八数码难题

發(fā)布時(shí)間:2025/3/20 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IDA*-洛谷P1379 八数码难题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

https://daniu.luogu.org/problem/show?pid=1379
省選的收獲
暗金
學(xué)會(huì)了A*啦啦啦;
我在第一天學(xué)了A*;
然后回家頹廢之余思考思考;
又問了van爺一些小問題;
然后就在fop_zz的 支持 嘲笑下AC了;
A*一開始感覺會(huì)很深?yuàn)W;
然而就是一個(gè)剪枝而已;
呵呵呵;
這里又一個(gè)估價(jià)函數(shù);
當(dāng)前狀態(tài)的估價(jià)函數(shù)是當(dāng)前在狀態(tài)理想情況下到達(dá)目標(biāo)狀態(tài)的代價(jià);
比如我們現(xiàn)在走了g步;
估價(jià)為H步;
然后我們迭代加深枚舉的k步(k從0開始枚舉,所以我們要預(yù)先特判無解情況,當(dāng)然可以掐秒);
如果g+H>k;
顯然萎了;
就是這么簡單;

至于為什么A*是dfs不是bfs;
因?yàn)閎fs沒有一個(gè)確定的k;
而dfs的k我們是枚舉的;

至于這樣的話有很多的重復(fù);
因?yàn)榧偃绱鸢甘?;
那么k=0~3時(shí)的搜索是無用的;
但是在這道題目里面顯然k不是很大;
而且加入k=ans爆搜的時(shí)間復(fù)雜度是n;
那么k=0~ans的時(shí)間復(fù)雜度類似與n*n;
雖然這樣,還是比直接暴力好;
那我們可不可以把k-1的所有g(shù)==k,g==k-1的狀態(tài)存下來呢;
好像很麻煩欸;
當(dāng)然樓k我們可以二分;

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define Ll long long using namespace std; int fx[9]{0,1,1,1,2,3,3,3,2}; int fy[9]{0,1,2,3,3,3,2,1,1}; int xx[4]{1,-1,0,0}; int yy[4]{0,0,-1,1}; int a[4][4]; int n,m,x,y,z,X,Y,ans; char c; int h(){int ans=0;for(int i=1;i<=3;i++)for(int j=1;j<=3;j++)if(a[i][j])ans+=abs(i-fx[a[i][j]])+abs(j-fy[a[i][j]]);return ans; } void dfs(int tf,int X,int Y,int g){int H=h();if(!H){ans=g;return;}if(g==tf||ans||H+g>tf)return;for(int i=0;i<4;i++){int x=X+xx[i];int y=Y+yy[i];if(x&&y&&x<4&&y<4){swap(a[X][Y],a[x][y]);dfs(tf,x,y,g+1);swap(a[X][Y],a[x][y]);}} } int main() {for(int i=1;i<=3;i++)for(int j=1;j<=3;j++){cin>>c; a[i][j]=c-48;if(!a[i][j])X=i,Y=j;}for(int tf=0;;tf++){dfs(tf,X,Y,0); if(ans){printf("%d",ans);return 0;};} }

至于為什么我枚舉的變量是tf;
用來紀(jì)念我ZJOI2017的頹廢;

轉(zhuǎn)載于:https://www.cnblogs.com/largecube233/p/6797886.html

總結(jié)

以上是生活随笔為你收集整理的IDA*-洛谷P1379 八数码难题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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