10085UVA最远的状态

来源:互联网 发布:淘宝衣服纯色背景 编辑:程序博客网 时间:2024/06/11 04:14

也是和例题几乎一样~

#include<stdio.h>#include<string.h>typedef int State[9];const int maxstate=1000000;const int dx[]={-1,1,0,0};const int dy[]={0,0,1,-1};char dir[]={'U','D','R','L'};State que[maxstate];int fa[maxstate];int op[maxstate];const int maxhash = 100000;int next[maxstate];int head[maxhash];int hash(State& s){int v=0;for(int i=0;i < 9;i++){v=v*10+s[i];}return v%maxhash;}bool tryinsert(int id) //id in que{int h=hash(que[id]);int u=head[h];while(u){if(0==memcmp(&que[u],&que[id],sizeof(State)))return false;u=next[u];}next[id]=head[h];head[h]=id;return true;}int bfs() //return pos in que{//initialize head array to store pos in quememset(head,0,sizeof(head));int front,rear;front=1,rear=2;while(front<rear){State& s= que[front]; //take a 'state' outint x,y,z;for(z=0; z<9;z++)if(!s[z])break;x = z/3;y = z%3;int nx,ny,nz;for(int i=0;i < 4;i++){nx=x+dx[i];ny=y+dy[i];if(nx>=0 && ny>=0 && nx<3 && ny<3){nz=nx*3+ny;State& t=que[rear];memcpy(&t,&s,sizeof(State));t[nz]=s[z];t[z]=s[nz];fa[rear]=front;op[rear]=i;if(tryinsert(rear))rear++;}}front++;////printf("~%d %d\n",front,rear);}return front-1;}void print(int id){if(fa[id]!=id){print(fa[id]);putchar(dir[op[id]]);}}int main(){//freopen("input.txt","r",stdin);freopen("out.txt","w",stdout);int t;scanf("%d",&t);for(int numcase=1;numcase <= t;numcase++){memset(fa,0,sizeof(fa));memset(op,0,sizeof(op));for(int i=0;i < 9;i++){scanf("%d",&que[1][i]);}fa[1]=1;op[1]=0;int end=bfs();printf("Puzzle #%d\n",numcase);for(int i=0;i<3;i++){printf("%d",que[end][i*3]);for(int j=1;j<3;j++){printf(" %d",que[end][i*3+j]);}putchar(10);}print(end);putchar(10);}}


0 0