Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
双向BFS,调试一个星期了,就是不对啊,单向的两个方向的都对#include<stdio.h> #include<string.h> #define N 365000 int fac[10]={1,2,6,24,120,720,5040,40320}; struct node { int pos;//记录‘x’位置 int pre;//记录前一个操作 int flag; char state[10];//记录现在的状态 }; char goal[10]="123456780"; node que[2][N],tmp,cur; int flag[2][N],last[2]; int h[2],t[2]; void swap(char &c1,char &c2) { char ch; ch=c1;c1=c2;c2=ch; } int change(char *c) { int i,j,count,l,k; int s=0;l=strlen(c); int a[10]; for(i=0;i<l;i++) if(c[i]=='0'){k=i;break;} for(i=0;i<k;i++) a[i]=c[i]-'0'; for(i=k+1;i<l;i++) a[i-1]=c[i]-'0'; a[i-1]=l-k-1; for(i=1;i<l-1;i++) { count=0; for(j=0;j<i;j++) if(a[i]<a[j])count++; s+=count*fac[i-1]; } s+=fac[l-2]*a[l-1]; return s; } int check(int i,int num) { if(flag[1-i][num]==1)return 1; else return 0; } void Sbfs() { int num; cur=que[0][t[0]]; if(cur.pos/3)//up 1 { tmp=cur; swap(tmp.state[cur.pos],tmp.state[cur.pos-3]); num=change(tmp.state); tmp.pos=cur.pos-3; if(check(0,num)) {last[0]=t[0];return;} if(!flag[0][num]) { tmp.pre=t[0]; tmp.flag=1; flag[0][num]=1; que[0][h[0]++]=tmp; } }//if if(cur.pos/3!=2)//down 2 { tmp=cur; swap(tmp.state[cur.pos],tmp.state[cur.pos+3]); num=change(tmp.state); tmp.pos=cur.pos+3; if(check(0,num)) {last[0]=t[0];return;} if(!flag[0][num]) { tmp.pre=t[0]; tmp.flag=2; flag[0][num]=1; que[0][h[0]++]=tmp; } }//if if(cur.pos%3)//left 3 { tmp=cur; swap(tmp.state[cur.pos],tmp.state[cur.pos-1]); num=change(tmp.state); tmp.pos=cur.pos-1; if(check(0,num)) {last[0]=t[0];return;} if(!flag[0][num]) { tmp.pre=t[0]; tmp.flag=3; flag[0][num]=1; que[0][h[0]++]=tmp; } }//if if(cur.pos%3!=2)//right 4 { tmp=cur; swap(tmp.state[cur.pos],tmp.state[cur.pos+1]); num=change(tmp.state); tmp.pos=cur.pos+1; if(check(0,num)) {last[0]=t[0];return;} if(!flag[0][num]) { tmp.pre=t[0]; tmp.flag=4; flag[0][num]=1; que[0][h[0]++]=tmp; } }//if }//Sbfs void Ebfs() { int num; cur=que[1][t[1]]; if(cur.pos/3)//up 1 { tmp=cur; swap(tmp.state[cur.pos],tmp.state[cur.pos-3]); num=change(tmp.state); tmp.pos=cur.pos-3; //if(check(1,num)) {last[1]=t[1];return;} if(!flag[1][num]) { tmp.pre=t[1]; tmp.flag=1; flag[1][num]=1; que[1][h[1]++]=tmp; if(check(1,num)) {last[1]=h[1]-1;return ;} } }//if if(cur.pos/3!=2)//down 2 { tmp=cur; swap(tmp.state[cur.pos],tmp.state[cur.pos+3]); num=change(tmp.state); tmp.pos=cur.pos+3; //if(check(1,num)){last[1]=t[1];return;} if(!flag[1][num]) { tmp.pre=t[1]; tmp.flag=2; flag[1][num]=1; que[1][h[1]++]=tmp; if(check(1,num)) {last[1]=h[1]-1;return ;} } }//if if(cur.pos%3)//left 3 { tmp=cur; swap(tmp.state[cur.pos],tmp.state[cur.pos-1]); num=change(tmp.state); tmp.pos=cur.pos-1; //if(check(1,num)) {last[1]=t[1];return;} if(!flag[1][num]) { tmp.pre=t[1]; tmp.flag=3; flag[1][num]=1; que[1][h[1]++]=tmp; if(check(1,num)) {last[1]=h[1]-1;return ;} } }//if if(cur.pos%3!=2)//right 4 { tmp=cur; swap(tmp.state[cur.pos],tmp.state[cur.pos+1]); num=change(tmp.state); tmp.pos=cur.pos+1; //if(check(1,num)) {last[1]=t[1];return;} if(!flag[1][num]) { tmp.pre=t[1]; tmp.flag=4; flag[1][num]=1; que[1][h[1]++]=tmp; if(check(1,num)) {last[1]=h[1]-1;return ;} } }//if }//Ebfs void Sprint(int t) { if(que[0][t].pre==-1) return ; Sprint(que[0][t].pre); switch(que[0][t].flag) { case 1 :printf("u");break; case 2 :printf("d");break; case 3 :printf("l");break; case 4 :printf("r");break; } } void Eprint(int t) { while(que[1][t].pre!=-1) { switch(que[1][t].flag) { case 1 :printf("d");break; case 2 :printf("u");break; case 3 :printf("r");break; case 4 :printf("l");break; } t=que[1][t].pre; } } int main() { int i; char ch[2]; while(scanf("%s",ch)!=EOF) { if(ch[0]=='x'){que[0][0].state[0]='0';que[0][0].pos=0;} else que[0][0].state[0]=ch[0]; for(i=1;i<9;i++) { scanf("%s",ch); if(ch[0]=='x'){que[0][0].state[i]='0';que[0][0].pos=i;} else que[0][0].state[i]=ch[0]; } que[0][0].state[i]=0; que[0][0].pre=-1; strcpy(que[1][0].state,goal); que[1][0].pre=-1; que[1][0].pos=8; memset(flag,0,sizeof(flag)); for(i=0;i<2;i++) last[i]=-1,h[i]=1,t[i]=0; while(t[0]<h[0]||t[1]<h[1]) { if(last[0]==-1){Sbfs();t[0]++;} if(last[1]==-1){Ebfs();t[1]++;} if(last[1]!=-1&&last[0]!=-1)break; } if(last[0]!=-1||last[1]!=-1) { Sprint(last[0]); //printf("\n"); Eprint(last[1]); printf("\n"); } else printf("unsolvable\n"); } } /* Sample Input 2 3 4 1 5 x 7 6 8 Sample Output ullddrurdllurdruldr */ Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator