搜索的好题啊~
BFS预处理出所有的状态,康拓判重,把读入的状态映射到“12345678“。
#include "queue"
#include "string"
#include "iostream"
#include "algorithm"
using namespace std;
int fac[10]={1,1,2,6,24,120,720,5040,40320,362880};
int hash[40329];
string ans[40329];
struct node
{
string ans;
int s[10],status;
};
int Contor(int s[])
{
int i,j,sum,cnt;
sum=0;
for (i=0;i<8;i++)
{
cnt=0;
for (j=i+1;j<8;j++)
if (s[j]<s[i]) cnt++;
sum+=cnt*fac[7-i];
}
return sum;
}
void bfs()
{
queue<node>q;
node cur,next;
int i;
for (i=0;i<8;i++) cur.s[i]=i+1;
cur.status=Contor(cur.s);
cur.ans="";
q.push(cur);
memset(hash,0,sizeof(hash));
hash[cur.status]=1;
while (!q.empty())
{
cur=q.front();
q.pop();
next=cur;
swap(next.s[0],next.s[7]);
swap(next.s[1],next.s[6]);
swap(next.s[2],next.s[5]);
swap(next.s[3],next.s[4]);
next.status=Contor(next.s);
if (hash[next.status]==0)
{
next.ans+='A';
hash[next.status]=1;
q.push(next);
ans[next.status]=next.ans;
}
next=cur;
swap(next.s[3],next.s[2]); swap(next.s[2],next.s[1]); swap(next.s[1],next.s[0]);
swap(next.s[4],next.s[5]); swap(next.s[5],next.s[6]); swap(next.s[6],next.s[7]);
next.status=Contor(next.s);
if (hash[next.status]==0)
{
next.ans+='B';
hash[next.status]=1;
q.push(next);
ans[next.status]=next.ans;
}
next=cur;
swap(next.s[1],next.s[6]); swap(next.s[6],next.s[5]); swap(next.s[5],next.s[2]);
next.status=Contor(next.s);
if (hash[next.status]==0)
{
next.ans+='C';
hash[next.status]=1;
q.push(next);
ans[next.status]=next.ans;
}
}
}
int main()
{
char str[11],end[11];
int a[11],mapping[11];
int i,status;
bfs();
while (cin>>str)
{
cin>>end;
for (i=0;i<8;i++)
a[str[i]-'0']=i+1;
for (i=0;i<8;i++)
mapping[i]=a[end[i]-'0'];
status=Contor(mapping);
cout<<ans[status]<<endl;
}
return 0;
}