「 Luogu P1379 」 八數碼難題
阿新 • • 發佈:2018-09-11
amp class image png 八數碼 bsp step nbsp pac
# 解題思路
這題不難,主要就是考慮如何判重,如果直接在 $9$ 個位置上都比較一遍的話。你會得到下面的好成績
所以考慮另一種方法:
將九個位置壓成一個整數,並且因為只有九個數,所以不會超出 $int$,用 $set$ 判重,寫一個 BFS 就過了
# 附上代碼
#include<iostream> #include<cstdio> #include<queue> #include<set> using namespace std; struct node{ int map,zerox,zeroy,step; };int pos=123804765; queue<node>P; set<int>S; int dx[7]={0,0,1,-1}; int dy[7]={1,-1,0,0}; void bfs(node now) { while(!P.empty()) { node now=P.front(); P.pop(); int map=now.map,x=now.zerox,y=now.zeroy,step=now.step; if(map==pos) { printf("%d",step); return ; } int nxt[5][5],k=map; for(int i=0;i<4;i++) { int xx=dx[i]+x,yy=dy[i]+y; if(xx>0&&xx<4&&yy>0&&yy<4) { k=map; for(int i=3;i>=1;i--) for(int j=3;j>=1;j--) nxt[i][j]=k%10,k/=10; nxt[x][y]=nxt[xx][yy],nxt[xx][yy]=0; int ps=0,h[15],o[15]; for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) ps=ps*10+nxt[i][j],h[nxt[i][j]]=i,o[nxt[i][j]]=j; if(!S.count(ps)) { S.insert(ps); P.push((node){ps,h[0],o[0],step+1}); } } } } } int main() { char p; int m=0,x0,y0; //scanf("%d",m); for(int i=1;i<=3;i++) { for(int j=1;j<=3;j++) { cin>>p; m=(p-‘0‘)+m*10; if(p==‘0‘) x0=i,y0=j; } } S.insert(m); P.push((node){m,x0,y0,0}); bfs(P.front()); }
「 Luogu P1379 」 八數碼難題