hdu 1043 eight

来源:互联网 发布:中国推理小说知乎 编辑:程序博客网 时间:2024/05/17 09:24

八数码 逆向dfs打表

#include<cstdio>#include<algorithm>#include<cstring>using namespace std;char ss[100];int c[100];struct data{    int a[10];    int loc;    int id;    int fa;    int di;    data(){fa=-1;}}st,que[400000],en;int trans[400000];int has(int a[]){    int sum=0;    for(int i=0;i<9;i++)    {        int num=0;        for(int j=i+1;j<9;j++)        {            if(a[i]>a[j])                num++;        }        sum+=num*c[9-1-i];    }    return sum+1;}int vis[400000];bool ok(int x,int y){    if(x<0||x>=3||y<0||y>=3)        return 0;    return 1;}int dx[]={0,0,1,-1};int dy[]={1,-1,0,0};char dire[]={'l','r','u','d'};int fa[400000];void show(int now){   // printf("now:%d \n",now);    if(now==-1||now==0)    {       // puts("aaaaaaaaaaa");        return ;    }    printf("%c",dire[que[now].di]);    show(que[now].fa);}void bfs(){    memset(fa,-1,sizeof fa);    int fron=0,rear=0;    memset(vis,0,sizeof vis);    vis[st.id]=1;    trans[st.id]=rear;    que[rear++]=st;    while(fron<rear)    {        data now=que[fron++];        int nx,ny;        nx=now.loc/3;        ny=now.loc%3;     //  printf("nx:%d  ny%d\n",nx,ny);        for(int i=0;i<4;i++)        {            int xx;            int yy;            xx=nx+dx[i];            yy=ny+dy[i];            if(!ok(xx,yy))                continue;            data ne=now;            ne.loc=xx*3+yy;            swap(ne.a[now.loc],ne.a[ne.loc]);//            for(int j=0;j<3;j++)//            {//                for(int k=0;k<3;k++)//                {//                    printf("%d ",ne.a[3*j+k]);//                }//                puts("");////            }//            printf("%d %d\n",ne.a[now.loc],ne.a[ne.loc]);           // getchar();            ne.id=has(ne.a);            ne.fa=fron-1;            ne.di=i;            if(!vis[ne.id])            {                vis[ne.id]=1;                trans[ne.id]=rear;              //  printf("%d %d\n",ne.id,rear);                que[rear++]=ne;            }        }    }}int main(){    c[0]=1;    for(int i=1;i<=9;i++)        c[i]=c[i-1]*i;    for(int i=0;i<9;i++)        st.a[i]=i+1;  memset(trans,-1,sizeof trans);    st.a[8]=0;    st.fa=-1;    st.loc=8;    st.id=has(st.a);    //printf("st.id:%d\n",st.id);    bfs();    while(scanf("%s",ss)!=EOF)    {        int x;        if(ss[0]=='x')            x=0;        else            x=ss[0]-'0';        en.a[0]=x;        for(int i=1;i<9;i++)        {            scanf("%s",ss);            int x;            if(ss[0]=='x')                x=0;            else                x=ss[0]-'0';            en.a[i]=x;        }////        for(int i=0;i<3;i++)//        {////            for(int j=0;j<3;j++)//            {////                printf("%d ",en.a[i*3+j]);//            }////            puts("");////        }        en.id=has(en.a);       // printf("en.id:%d\n",en.id);        if(!vis[en.id])        {           puts("unsolvable");        }        else if(en.id!=st.id)        {            show(trans[en.id]);            puts("");        }        else        {            puts("lr");        }    }    return 0;}
0 0
原创粉丝点击