
Untitled
By: a guest on
May 21st, 2012 | syntax:
None | size: 2.86 KB | hits: 15 | expires: Never
#include<stdio.h>
#include<memory.h>
#include<map>
#include<string>
#include<time.h>
using namespace std;
int l[363000][9],ln,cr[9];
void setall(int p)
{
int i;
if(p==9)
{
for(i=0;i<9;i++)
{
l[ln][cr[i]]=i;
}
ln++;
}
else
{
for(i=0;i<9;i++)
{
if(cr[i]==-1)
{
cr[i]=p;
setall(p+1);
cr[i]=-1;
}
}
}
}
int search(int C[9])
{
int i,L,R,md,ll,rr;
ll=0;
rr=ln-1;
for(i=0;i<9;i++)
{
L=ll;
R=rr;
while(L<=R)
{
md=(L+R)/2;
if(l[md][i]<C[i])
{
L=md+1;
}
else
{
if(l[md][i]==C[i])
{
ll=md;
}
R=md-1;
}
}
L=ll;
R=rr;
while(L<=R)
{
md=(L+R)/2;
if(l[md][i]<=C[i])
{
if(l[md][i]==C[i])
{
rr=md;
}
L=md+1;
}
else
{
R=md-1;
}
}
}
return ll;
}
int q[400000][9];
int d[400000];
int h[400000],h2[400000];
void run(int start[9])
{
int bot,top,tmp,i,j,cur[9],cc;
bot=0;top=1;
for(i=0;i<9;i++)
{
q[0][i]=start[i];
}
d[search(start)]=0;
while(bot<top)
{
for(i=0;i<9;i++)
{
cur[i]=q[bot][i];
}
bot++;
cc=search(cur);
if(cc==0)break;
for(i=0;i<9;i++)
{
if(cur[i]==8)break;
}
if(i>=3)
{
tmp=cur[i];
cur[i]=cur[i-3];
cur[i-3]=tmp;
tmp=search(cur);
if(d[tmp]==-1)
{
d[tmp]=d[cc]+1;
h[tmp]=1;
h2[tmp]=cc;
for(j=0;j<9;j++)
q[top][j]=cur[j];
top++;
}
tmp=cur[i];
cur[i]=cur[i-3];
cur[i-3]=tmp;
}
if(i<=5)
{
tmp=cur[i];
cur[i]=cur[i+3];
cur[i+3]=tmp;
tmp=search(cur);
if(d[tmp]==-1)
{
d[tmp]=d[cc]+1;
h[tmp]=2;
h2[tmp]=cc;
for(j=0;j<9;j++)
q[top][j]=cur[j];
top++;
}
tmp=cur[i];
cur[i]=cur[i+3];
cur[i+3]=tmp;
}
if(i%3>0)
{
tmp=cur[i];
cur[i]=cur[i-1];
cur[i-1]=tmp;
tmp=search(cur);
if(d[tmp]==-1)
{
d[tmp]=d[cc]+1;
h[tmp]=3;
h2[tmp]=cc;
for(j=0;j<9;j++)
q[top][j]=cur[j];
top++;
}
tmp=cur[i];
cur[i]=cur[i-1];
cur[i-1]=tmp;
}
if(i%3<2)
{
tmp=cur[i];
cur[i]=cur[i+1];
cur[i+1]=tmp;
tmp=search(cur);
if(d[tmp]==-1)
{
d[tmp]=d[cc]+1;
h[tmp]=4;
h2[tmp]=cc;
for(j=0;j<9;j++)
q[top][j]=cur[j];
top++;
}
tmp=cur[i];
cur[i]=cur[i+1];
cur[i+1]=tmp;
}
}
}
char ans[1000];
int main()
{
int i,j,start[9];
char ch[3],ddd[5]="udlr";
// freopen("input.txt","r",stdin);
memset(cr,-1,sizeof(cr));
setall(0);
for(i=0;i<9;i++)
{
scanf("%s",ch);
if(ch[0]=='x')
ch[0]='9';
start[i]=ch[0]-'1';
}
memset(d,-1,sizeof(d));
memset(h,-1,sizeof(h));
run(start);
i=j=0;
while(h[i]!=-1)
{
ans[j++]=ddd[h[i]-1];
i=h2[i];
}
ans[j]=0;
for(i=j-1;i>=0;i--)
printf("%c",ans[i]);
printf("\n");
return 0;
}