1. 程式人生 > >「 Luogu P1379 」 八數碼難題

「 Luogu P1379 」 八數碼難題

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 」 八數碼難題