#include <iostream>
#include <queue>
#include <string>
#include <memory.h>
using namespace std;
typedef struct Moban
{
//string s;//模板的状态
int node[8];
string op;//操作的字符串
}Moban;
int n;//步数的限定值
int target[8];//目标模板状态
bool flag[8][8][8][8][8][8][8][8];
void change(Moban temp,Moban& result,int step)
{
if(step == 1)//进行A操作,上下行互换
{
result.node[0] = temp.node[4];
result.node[1] = temp.node[5];
result.node[2] = temp.node[6];
result.node[3] = temp.node[7];
result.node[4] = temp.node[0];
result.node[5] = temp.node[1];
result.node[6] = temp.node[2];
result.node[7] = temp.node[3];
result.op = temp.op + 'A';
}
else if(step == 2)//B操作,行循环右移一个
{
result.node[0] = temp.node[3];
result.node[1] = temp.node[0];
result.node[2] = temp.node[1];
result.node[3] = temp.node[2];
result.node[4] = temp.node[7];
result.node[5] = temp.node[4];
result.node[6] = temp.node[5];
result.node[7] = temp.node[6];
result.op = temp.op + 'B';
}
else if(step == 3)//C操作,中间四小块顺时针转一格
{
result.node[0] = temp.node[0];
result.node[1] = temp.node[5];
result.node[2] = temp.node[1];
result.node[3] = temp.node[3];
result.node[4] = temp.node[4];
result.node[5] = temp.node[6];
result.node[6] = temp.node[2];
result.node[7] = temp.node[7];
result.op = temp.op + 'C';
}
}
bool isResult(int a[],int b[])
{
for(int i = 0;i < 8;i++)
if(a[i] != b[i])
return false;
return true;
}
void bfs(Moban g)
{
if(isResult(g.node,target))
{
cout << "0" << endl;
return;
}
queue<Moban> q;
q.push(g);
// m[g.s] = 1;
memset(flag,false,sizeof(flag));
flag[g.node[0] - 1][g.node[1] - 1][g.node[2] - 1][g.node[3] - 1][g.node[4] - 1][g.node[5] - 1][g.node[6] - 1][g.node[7] - 1] = true;
while(!q.empty())
{
Moban temp = q.front();
q.pop();
if(temp.op.size() >= n)//步数超过给定的值
{
cout << "-1" << endl;
return;
}
for(int i = 1;i < 4;i++)
{
Moban changed;
change(temp,changed,i);
if(isResult(changed.node,target))
{
cout << changed.op.size() << " " << changed.op << endl;
return;
}
if(!flag[changed.node[0] - 1][changed.node[1] - 1][changed.node[2] - 1][changed.node[3] - 1][changed.node[4] - 1][changed.node[5] - 1][changed.node[6] - 1][changed.node[7] - 1])
{
// m[changed.s] = 1;
flag[changed.node[0] - 1][changed.node[1] - 1][changed.node[2] - 1][changed.node[3] - 1][changed.node[4] - 1][changed.node[5] - 1][changed.node[6] - 1][changed.node[7] - 1] = true;
q.push(changed);
}
}
}
}
int main()
{
while(cin >> n && n != -1)
{
Moban g;
for(int i = 0;i < 8;i++)
{
cin >> target[i];
}
g.op = "";
g.node[0] = 1;
g.node[1] = 2;
g.node[2] = 3;
g.node[3] = 4;
g.node[4] = 8;
g.node[5] = 7;
g.node[6] = 6;
g.node[7] = 5;
bfs(g);
}
return 0;
}
sicily 1150,1151.魔版
最新推荐文章于 2014-01-06 13:06:36 发布