12345678 17245368 12345678 82754631
C AC
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
struct Node
{
char board[8],key[101];
int step;
bool operator <( const Node n )const
{
return step<n.step;
}
};
struct VIS
{
int flag;
Node k;
}vis[40320+1];
int fac[] = {1,1,2,6,24,120,720,5040,40320};
char ini[8],ans[8];
// 康托展开
int kangtuo(char a[])
{
int i,j,t,sum;
sum=0;
for( i=0; i<8 ;++i)
{
t=0;
for(j=i+1;j<8;++j)
if( a[i]>a[j] )
++t;
sum+=t*fac[8-i-1];
}
return sum+1;
}
// 输出函数
void print( Node n,Node m )
{
int i;
for(i=0;i<n.step;++i)
cout<<n.key[i];
for(i=m.step-1;i>=0;--i)
cout<<m.key[i];
cout<<endl;
}
void bfs( void )
{
memset(vis,0,sizeof(vis));
priority_queue <Node> q;
priority_queue <Node> p;
Node pre,lst;
int i,sp=0;
// 初始化
for(i=0;i<8;++i)
pre.board[i]=ini[i];
pre.step=0;
vis[kangtuo(pre.board)].flag=1;
vis[kangtuo(pre.board)].k=pre;
q.push(pre);
for(i=0;i<8;++i)
pre.board[i]=ans[i];
pre.step=0;
vis[kangtuo(pre.board)].flag=2;
vis[kangtuo(pre.board)].k=pre;
p.push(pre);
// 双向BFS
while( !q.empty() && !p.empty() )
{
// 将每一层都扩展
while( q.top().step==sp )
{
pre=q.top();
q.pop();
// 按A方案变化
lst=pre;
for(i=0; i<8; ++i)
lst.board[i]=pre.board[7-i];
lst.key[lst.step++]=‘A‘;
if( vis[kangtuo(lst.board)].flag==2 )
{
print(lst,vis[kangtuo(lst.board)].k);
return;
}
if( !vis[kangtuo(lst.board)].flag )
{
vis[kangtuo(lst.board)].flag=1;
vis[kangtuo(lst.board)].k=lst;
q.push(lst);
}
// 按B方案变化
lst=pre;
for(i=0; i<8; ++i)
{
if(i==0) lst.board[i]=pre.board[3];
else if(i==7) lst.board[i]=pre.board[4];
else lst.board[i]=pre.board[i-1];
}
lst.key[lst.step++]=‘B‘;
if( vis[kangtuo(lst.board)].flag==2 )
{
print(lst,vis[kangtuo(lst.board)].k);
return;
}
if( !vis[kangtuo(lst.board)].flag )
{
vis[kangtuo(lst.board)].flag=1;
vis[kangtuo(lst.board)].k=lst;
q.push(lst);
}
// 按C方案变化
lst=pre;
lst.board[1]=pre.board[6];
lst.board[2]=pre.board[1];
lst.board[5]=pre.board[2];
lst.board[6]=pre.board[5];
lst.key[lst.step++]=‘C‘;
if( vis[kangtuo(lst.board)].flag==2 )
{
print(lst,vis[kangtuo(lst.board)].k);
return;
}
if( !vis[kangtuo(lst.board)].flag )
{
vis[kangtuo(lst.board)].flag=1;
vis[kangtuo(lst.board)].k=lst;
q.push(lst);
}
}
while( p.top().step==sp )
{
pre=p.top();
p.pop();
//A
lst=pre;
for(i=0; i<8; ++i)
lst.board[i]=pre.board[7-i];
if( vis[kangtuo(lst.board)].flag==1 )
{
print(vis[kangtuo(lst.board)].k,lst);
return;
}
if( !vis[kangtuo(lst.board)].flag )
{
lst.key[lst.step++]=‘A‘;
vis[kangtuo(lst.board)].flag=2;
vis[kangtuo(lst.board)].k=lst;
p.push(lst);
}
//B
lst=pre;
for(i=0; i<8; ++i)
{
if(i==0) lst.board[i]=pre.board[3];
else if(i==7) lst.board[i]=pre.board[4];
else lst.board[i]=pre.board[i-1];
}
if( vis[kangtuo(lst.board)].flag==1 )
{
print(vis[kangtuo(lst.board)].k,lst);
return;
}
if( !vis[kangtuo(lst.board)].flag )
{
lst.key[lst.step++]=‘B‘;
vis[kangtuo(lst.board)].flag=2;
vis[kangtuo(lst.board)].k=lst;
p.push(lst);
}
//C
lst=pre;
lst.board[1]=pre.board[6];
lst.board[2]=pre.board[1];
lst.board[5]=pre.board[2];
lst.board[6]=pre.board[5];
if( vis[kangtuo(lst.board)].flag==1 )
{
print(vis[kangtuo(lst.board)].k,lst);
return;
}
if( !vis[kangtuo(lst.board)].flag )
{
lst.key[lst.step++]=‘C‘;
vis[kangtuo(lst.board)].flag=2;
vis[kangtuo(lst.board)].k=lst;
p.push(lst);
}
}
++sp;
}
}
int main()
{
while( cin.getline(ini,10,‘\n‘) )
{
cin.getline(ans,10,‘\n‘);
bfs();
}
return 0;
}
ACM-双向BFS之魔板——求助ING!,布布扣,bubuko.com
原文地址:http://blog.csdn.net/lttree/article/details/24811373