您的位置:首页 > 其它

八数码问题(bfs,hash判重)

2017-11-01 17:02 253 查看
#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;

            in
9dd5
t 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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: