#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<vector>
using namespace std;
struct node
{
int pre;
int op;
int x;
int y;
};
node path[10][370000];
string ps[370000];
int vis[10][370000];
int dir[4][2] = {{-1,0},{0,1},{0,-1},{1,0}};
char ss[4] = { 'u','r','l','d'};
int fac[] = {1,1,2,6,24,120,720,5040,40320,362880}; //i的阶乘为fac[i]
int Cantor(string s){
int sum = 0;
for(int i = 0; i < 9; i++){
int num = 0;
for(int j = i+1; j < 9; j++){
if(s[j] < s[i])
num++;//确定当前元素i在未出现的元素中是第几个(从小到大)
}
sum += fac[8-i] * num;
}
return sum;
}
void bfs(int pathi,string inits,int initx,int inity)
{
for(int i=0;i<380000;i++)vis[pathi][i] =-1;
int counts =0;
path[pathi][counts].pre = -1;
ps[counts] = inits;
path[pathi][counts].x=initx;
path[pathi][counts].y=inity;
queue<int> qu;
qu.push(counts);
int visn;
visn = Cantor(ps[counts]);
vis[pathi][visn] =counts;
counts++;
while(!qu.empty())
{
int f = qu.front();
//cout<<f<<" "<<ps[f]<<endl;
qu.pop();
//cout<<f<<" "<<path[pathi][f].op<<" "<<ps[f]<<endl;
int x = path[pathi][f].x;
int y = path[pathi][f].y;
char tp;
for(int i=0;i<4;i++)
{
int px = x+dir[i][0];
int py = y+dir[i][1];
if(px<0||px>2||py<0||py>2)continue;
tp = ps[f][px*3+py]; // 开始转换
ps[f][px*3+py] = ps[f][x*3+y];
ps[f][x*3+y] = tp;
visn = Cantor(ps[f]); //判断是否出现过
if(vis[pathi][visn]!=-1)
{
tp = ps[f][px*3+py]; // 开始转换
ps[f][px*3+py] = ps[f][x*3+y];
ps[f][x*3+y] = tp;
continue;
}
vis[pathi][visn] =counts;
path[pathi][counts].op = i;
path[pathi][counts].pre = f;
ps[counts] = ps[f];
path[pathi][counts].x = px;
path[pathi][counts].y = py;
qu.push(counts);
counts++;
tp = ps[f][px*3+py]; // 开始转换
ps[f][px*3+py] = ps[f][x*3+y];
ps[f][x*3+y] = tp;
}
}
}
int main()
{
int nmap[10];
//bfs(int pathi,string inits,int initx,int inity);
bfs(0,"012345678",0,0);
bfs(1,"102345678",0,1);
bfs(2,"120345678",0,2);
bfs(3,"123045678",1,0);
bfs(4,"123405678",1,1);
bfs(5,"123450678",1,2);
bfs(6,"123456078",2,0);
bfs(7,"123456708",2,1);
bfs(7,"123456708",2,1);
bfs(8,"123456780",2,2);
int t;
string st;
string en;
ios::sync_with_stdio(false);
//cout<<"dede"<<endl;
cin>>t;
for(int ppt=1;ppt<=t;ppt++)
{
cin>>st;
cin>>en;
int posx;
int px=1;
for(int i=0;i<9;i++)
{
if(st[i]=='X')
{
posx=i;
continue;
}
nmap[st[i]-'0'] = px;
px++;
}
for(int i=0;i<9;i++)
{
// cout<<i<<" ";
if(en[i]=='X')
{
en[i] ='0';
}
else en[i] = nmap[en[i]-'0'] + '0';
// cout<<en[i]<<endl;
}
//cout<<st<<" "<<en<<endl;
//cout<<posx<<endl;
int viss;
viss = Cantor(en);
vector<char> re1;
if(vis[posx][viss] !=-1)
{
viss = vis[posx][viss]; //获取该点的下标
//cout<<"vis =" <<vis<<endl;
while(path[posx][viss].pre!=-1)
{
re1.push_back(ss[path[posx][viss].op]);
viss = path[posx][viss].pre;
}
cout<<"Case "<<ppt<<": "<<re1.size()<<endl;
for(int i = re1.size()-1;i>=0;i--)cout<<re1[i];
cout<<endl;
}
}
return 0;
}
http://www.voidcn.com/article/p-bctlciua-bcx.html