八中OJ——1849 八数码 的错误代码

来源:互联网 发布:淘宝联盟禁止自推自买 编辑:程序博客网 时间:2024/05/01 07:48
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#define maxn 1000000//质数using namespace std; typedef int state[9];//每种情况 的状态state st[maxn],aim;//list <int> v[maxnlen];int dist[maxn];int dx[4]={-1,1,0,0};int dy[4]={0,0,-1,1};int contor[]={0,1, 2, 6, 24, 120,720, 5040, 40320};bool find_case[maxn];bool Contor(state& s);int bfs(); int main(){    int i;    for(i=0;i<9;i++)        scanf("%d",&st[1][i]);    for(i=0;i<9;i++)        scanf("%d",&aim[i]);    int ans=bfs();    if(ans>0)        printf("%d",ans);    else        printf("-1\n");    return 0;}/*bool hash(state& s){    int x=0,i;    for(i=0;i<9;i++)        x= x*10+s[i];    for(list <int> :: iterator p=v[x%maxnlen].begin(); p != v[x%maxnlen].end();p++)        if(*p == x)            return false;    v[x%maxn].push_back(x);    return true;}*/bool Contor(state& s){    int x=0,i;    for(i=8;i>=0;i--)        x += s[i]*contor[i];    if(find_case[x]==1)        return 0;    else    {        find_case[x]=1;        return 1;    }}int bfs(){    int f=1,r=2;    while(f<r)    {        int z,d,x,y;        state& s=st[f];        if(!memcmp(aim,s,sizeof(s)))//判断            return dist[f];        for(z=0;z<9;z++)            if(s[z]==0)                break;        x=z/3;y=z%3;        for(d=0;d<4;d++)//移动        {            int nx,ny,nz;//移动后的坐标            nx=x+dx[d];            ny=y+dy[d];            nz=nx*3+ny;            if((nx>0&&nx<3)&&(ny>=0&&ny<3))//OK            {                state& t=st[r];                memcpy(&t,&s,sizeof(s));                t[nz]=s[z];//复制                t[z]=s[nz];                dist[r]=dist[f]+1;                if(Contor(st[r]))                    r++;            }        }        f++;    }    return 0;}
0 0
原创粉丝点击