由于用深度优先搜索算法不能提交,故采用广度搜索优先算法。这里的广度优先算法比较特殊一点,就是我采用了类似加法器的进位机制来实现。(make by liurunjia 转载请注明出处,thx)
#include <stdlib.h>
#include <iostream>
using namespace std;
#define N 10
//定义数据结构
typedef struct node{
int a1;
int a2;
int a3;
int a4;
int a5;
int a6;
int a7;
int a8;
}Node;
//操作数组
char optArray[N];
Node StateNode;//表示当前状态
Node Target;//表示目标状态
int STEP;
//声明比较函数
bool isEqual(Node a,Node b);
//声明操作函数(操作符)
void operatorFunction(char opt);
//模仿加法进位,返回值表示是否已经达到最大值,即不能再进位了
bool IncreaseByStep()
{
bool flag=true;
for(int i=0;i<STEP&&flag;i++)
{
if(optArray[i]=='O')
{
optArray[i]='A';
flag=false;
continue;
}
else if(optArray[i]=='A')
{
optArray[i]='B';
flag=false;
continue;
}
else if(optArray[i]=='B')
{
optArray[i]='C';
flag=false;
continue;
}
else
{
if(i==STEP-1)
{
return false;
}
optArray[i]='A';
continue;
}
}
// for(int i=0;i<N;i++)
// {
// cout<<optArray[i];
// }
// cout<<endl;
return true;
}
//
void init()
{
for(int i=0;i<N;i++)
{
optArray[i]='O';
}
}
void initState()
{
StateNode.a1=1;
StateNode.a2=2;
StateNode.a3=3;
StateNode.a4=4;
StateNode.a5=8;
StateNode.a6=7;
StateNode.a7=6;
StateNode.a8=5;
}
int main()
{
while(cin>>STEP&&STEP!=-1)
{
cin>>Target.a1>>Target.a2>>Target.a3>>Target.a4>>Target.a5>>Target.a6>>Target.a7>>Target.a8;
bool myFlag=true;
init();
initState();
while(myFlag)
{
if(IncreaseByStep())
{
initState();
bool stepFlag=true;
int stepInfact;
for(int j=N-1;j>=0;j--)
{
if(optArray[j]!='O')
{
if(stepFlag)
{
stepInfact=j+1;
stepFlag=false;
}
operatorFunction(optArray[j]);
}
}
if(isEqual(StateNode,Target))
{
cout<<stepInfact<<" ";
for(int j=stepInfact-1;j>=0;j--)
{
cout<<optArray[j];
}
cout<<endl;
myFlag=false;
}
}
else
{
myFlag=false;
}
}
if(myFlag)
{
cout<<-1<<endl;
}
}
}
//定义比较函数
bool isEqual(Node a,Node b)
{
return a.a1==b.a1&&a.a2==b.a2&&a.a3==b.a3&&a.a4==b.a4&&a.a5==b.a5&&a.a6==b.a6&&a.a7==b.a7&&a.a8==b.a8;
}
//定义操作函数(操作符)
void operatorFunction(char opt)
{
if(opt=='A')
{
int temp=StateNode.a1;
StateNode.a1=StateNode.a5;
StateNode.a5=temp;
temp=StateNode.a2;
StateNode.a2=StateNode.a6;
StateNode.a6=temp;
temp=StateNode.a3;
StateNode.a3=StateNode.a7;
StateNode.a7=temp;
temp=StateNode.a4;
StateNode.a4=StateNode.a8;
StateNode.a8=temp;
}
else if(opt=='B')
{
int temp=StateNode.a4;
StateNode.a4=StateNode.a3;
StateNode.a3=StateNode.a2;
StateNode.a2=StateNode.a1;
StateNode.a1=temp;
temp=StateNode.a8;
StateNode.a8=StateNode.a7;
StateNode.a7=StateNode.a6;
StateNode.a6=StateNode.a5;
StateNode.a5=temp;
}
else
{
int temp=StateNode.a2;
StateNode.a2=StateNode.a6;
StateNode.a6=StateNode.a7;
StateNode.a7=StateNode.a3;
StateNode.a3=temp;
}
// cout<<opt<<endl;
// cout<<StateNode.a1<<" "<<StateNode.a2<<" "<<StateNode.a3<<" "<<StateNode.a4<<endl;
// cout<<StateNode.a5<<" "<<StateNode.a6<<" "<<StateNode.a7<<" "<<StateNode.a8<<endl;
}