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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

IDA*-洛谷P1379 八数码难题

發布時間:2025/3/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IDA*-洛谷P1379 八数码难题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

至于為什么A*是dfs不是bfs;
因為bfs沒有一個確定的k;
而dfs的k我們是枚舉的;

至于這樣的話有很多的重復;
因為假如答案是4;
那么k=0~3時的搜索是無用的;
但是在這道題目里面顯然k不是很大;
而且加入k=ans爆搜的時間復雜度是n;
那么k=0~ans的時間復雜度類似與n*n;
雖然這樣,還是比直接暴力好;
那我們可不可以把k-1的所有g==k,g==k-1的狀態存下來呢;
好像很麻煩欸;
當然樓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;
用來紀念我ZJOI2017的頹廢;

轉載于:https://www.cnblogs.com/largecube233/p/6797886.html

總結

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

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