| ||||||||||
| 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 | |||||||||
双向广搜+康托展开 代码-47ms#include <stdio.h>
#include <memory.h>
#include <queue>
#include <algorithm>
#include <vector>
#include <iterator>
using namespace std;
typedef struct{
int pos;
char data[10];
int hash;
}Node;
const int fac[]={1,1,2,6,24,120,720,5040,40320,362880};
const int dir[4][2]={0,1,0,-1,1,0,-1,0};
const int MAXN=363000;
const char str[5]="rldu";
const char revstr[5]="lrud";
short vis[MAXN];
int pre[MAXN];
char path[MAXN];
vector<char>road1,road2;
vector<char>::iterator it;
int num1,num2,middle;
int GetCantorHash(const Node &p)
{ int i,j,num=0,sum=0;
for(i=0;i<9;++i)
{ num=0;
for(j=i+1;j<9;++j)
if(p.data[j]<p.data[i]) num++;
sum+=(num*fac[9-1-i]);
}
return sum;
}
queue<Node>q1,q2;
void Initial()
{ while(!q1.empty()) q1.pop();
while(!q2.empty()) q2.pop();
memset(vis,0,sizeof(vis));
memset(pre,-1,sizeof(pre));
num1=num2=0;
road1.clear(),road2.clear();
}
void RemmberPath1(int hash)
{ while(pre[hash]!=-1)
{ road1.push_back(path[hash]);
hash=pre[hash];
}
hash=middle;
while(pre[hash]!=-1)
{ road2.push_back(path[hash]);
hash=pre[hash];
}
reverse(road1.begin(),road1.end());
}
void RemmberPath2(int hash)
{ while(pre[hash]!=-1)
{ road2.push_back(path[hash]);
hash=pre[hash];
}
hash=middle;
while(pre[hash]!=-1)
{ road1.push_back(path[hash]);
hash=pre[hash];
}
reverse(road1.begin(),road1.end());
}
bool EightDFS(bool flag)
{ Node now,temp;
int x,y,i;
if(flag) now=q1.front(),q1.pop();
else now=q2.front(),q2.pop();
for(i=0;i<4;++i)
{ x=now.pos/3+dir[i][0];
y=now.pos%3+dir[i][1];
if(x<0||x>2||y<0||y>2) continue;
temp=now;
temp.pos=x*3+y;
swap(temp.data[now.pos],temp.data[temp.pos]);
temp.hash=GetCantorHash(temp);
if(flag)
{ if(vis[temp.hash]==0)
{ vis[temp.hash]=1;
pre[temp.hash]=now.hash;
path[temp.hash]=str[i];
q1.push(temp),num1++;
}
else if(vis[temp.hash]==2)
{ middle=temp.hash;
RemmberPath1(now.hash);
path[middle]=str[i];
return 1;
}
}
else
{ if(vis[temp.hash]==0)
{ vis[temp.hash]=2;
pre[temp.hash]=now.hash;
path[temp.hash]=revstr[i];
q2.push(temp),num2++;
}
else if(vis[temp.hash]==1)
{ middle=temp.hash;
RemmberPath2(now.hash);
path[middle]=revstr[i];
return 1;
}
}
}
return 0;
}
bool BothDFS(char *s,int pos)
{ Node temp;
Initial();
strcpy(temp.data,s);
temp.pos=pos;
temp.hash=GetCantorHash(temp);
vis[temp.hash]=1,num1++;
q1.push(temp);
strcpy(temp.data,"123456780");
temp.pos=8;
temp.hash=GetCantorHash(temp);
vis[temp.hash]=2,num2++;
q2.push(temp);
while(!q1.empty()||!q2.empty())
{ if(num1<=num2)
{ if(EightDFS(1))
return 1;
}
else if(EightDFS(0)) return 1;
}
return 0;
}
void PrintOut()
{ for(it=road1.begin();it!=road1.end();it++)
printf("%c",*it);
printf("%c",path[middle]);
for(it=road2.begin();it!=road2.end();it++)
printf("%c",*it);
puts("");
}
int main()
{ int i,len,pos;
char s[101],t[10];
while(gets(s)!='\0')
{ len=0;
for(i=0;s[i]!='\0';++i)
{ if(s[i]=='x')
{ pos=len;
t[len++]='0';
continue;
}
if('1'<=s[i]&&s[i]<='8')
t[len++]=s[i];
}
t[len]='\0';
if(BothDFS(t,pos)) PrintOut();
else puts("unsolvable");
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator