八數碼問題(bfs,hash判重)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
const int mod=1000003;
int xx[]={1,-1,0,0};
int yy[]={0,0,1,-1};
struct node{
    ll x,y;
}q[maxn];
char s[15];
int a[maxn],ans=123804765,l,r;
vector<int> g[mod];
int main(){
    scanf("%s",s);
    long long num=0;
    int len=strlen(s);
    for(int i=0;i<len;i++){
        num=num*10+s[i]-'0';
    }
    //cout<<num<<endl;
    l=r=0;
    node now; now.x=num; now.y=0; q[++r]=now;
    int b[10];
    //cout<<1<<endl;
    for(int i=8;i>=0;i--){
            int nowx10=now.x/pow(10,i);
            b[9-i]=(nowx10)%10;
        }
    /*for(int i=1;i<=9;i++) cout<<b[i]<<' ';
    cout<<endl;*/
    /*int curx1,cury1,curz1;
    for(int i=1;i<=9;i++) if(b[i]==0){
            curx1=(i-1)/3+1;
            if(i%3==0){
                cury1=3;
            }
            else cury1=i%3;
            curz1=i;
        }
    cout<<curx1<<' '<<cury1<<' '<<curz1<<endl;*/
    while(l<r){
        now=q[++l];
        int nowx=now.x,xx2,xx1=now.x;
        //cout<<now.x<<' '<<now.y<<endl;
        if(nowx==ans){
            cout<<now.y<<endl;
            break;
        }
        //cout<<2<<endl;
        for(int i=8;i>=0;i--){
            int nowx1=nowx/pow(10,i);
            b[9-i]=(nowx1)%10;
        }
        //cout<<1<<endl;
        int curx,cury,curz;
        for(int i=1;i<=9;i++) if(b[i]==0){
            curx=(i-1)/3+1;
            if(i%3==0){
                cury=3;
            }
            else cury=i%3;
            curz=i;
        }
        for(int i=0;i<4;i++){
            int fx=curx+xx[i],fy=cury+yy[i];
            if(fx<1||fx>3||fy<1||fy>3) continue;
            int num=(fx-1)*(3)+fy;
            for(int j=1;j<=9;j++)
                a[j]=b[j];
            int tmp=a[num]; a[num]=0; a[curz]=tmp;
            int now1=0,now2;
            for(int j=1;j<=9;j++){
                now1=now1*10+a[j];
            }
            now2=now1;
            now1%=mod;
            int f=true;
            for(int j=0;j<g[now1].size();j++){
                if(g[now1][j]==now2){
                    f=false; break;
                }
            }
            if(f){
                node now3; now3.x=now2; now3.y=now.y+1;
                q[++r]=now3; g[now1].push_back(now2);
            }
            a[num]=tmp; a[curz]=0;
        }    
    }
    return 0;
}
發佈了96 篇原創文章 · 獲贊 13 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章