记录编号 47743 评测结果 AAAAAAAA
题目名称 魔板 最终得分 100
用户昵称 GravatarTruth.Cirno 是否通过 通过
代码语言 C++ 运行时间 0.068 s
提交时间 2012-11-03 10:55:33 内存使用 16.76 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;

struct quetype
{
	int deep,dad,rec,data[8];
};

int sq8[8]={1};
bool used[16777216];
vector<quetype> que;

void printway(int poi)
{
	if (poi)
	{
		printway(que[poi].dad);
		cout<<char(que[poi].rec+'A'-1);
	}
}

int main(void)
{
	freopen("msquare.in","r",stdin);
	freopen("msquare.out","w",stdout);
	unsigned int tail=0;
	int i,tar=0,temp;
	quetype a,b;
	for (i=1;i<8;i++)
		sq8[i]=sq8[i-1]*8;
	for (i=0;i<4;i++)
	{
		cin>>temp;
		temp--;
		tar+=sq8[i]*temp;
	}
	for (i=7;i>=4;i--)
	{
		cin>>temp;
		temp--;
		tar+=sq8[i]*temp;
	}
	a.data[0]=0;
	a.data[1]=1;
	a.data[2]=2;
	a.data[3]=3;
	a.data[4]=7;
	a.data[5]=6;
	a.data[6]=5;
	a.data[7]=4;
	temp=0;
	for (i=0;i<8;i++)
		temp+=sq8[i]*a.data[i];
	if (temp==tar)
	{
		cout<<"0\n";
		return(0);
	}
	used[temp]=true;
	a.deep=0;
	a.dad=-1;
	a.rec=0;
	que.push_back(a);
	while (tail<que.size())
	{
		a=que[tail];
		/*1*/
		for (i=0;i<4;i++)
			b.data[i]=a.data[i+4];
		for (i=4;i<8;i++)
			b.data[i]=a.data[i-4];
		temp=0;
		for (i=0;i<8;i++)
			temp+=sq8[i]*b.data[i];
		if (!used[temp])
		{
			used[temp]=true;
			b.deep=a.deep+1;
			b.dad=tail;
			b.rec=1;
			que.push_back(b);
			if (temp==tar)
				break;/*ans*/
		}
		/*1*/
		/*2*/
		b.data[0]=a.data[3];
		b.data[1]=a.data[0];
		b.data[2]=a.data[1];
		b.data[3]=a.data[2];
		b.data[4]=a.data[7];
		b.data[5]=a.data[4];
		b.data[6]=a.data[5];
		b.data[7]=a.data[6];
		temp=0;
		for (i=0;i<8;i++)
			temp+=sq8[i]*b.data[i];
		if (!used[temp])
		{
			used[temp]=true;
			b.deep=a.deep+1;
			b.dad=tail;
			b.rec=2;
			que.push_back(b);
			if (temp==tar)
				break;/*ans*/
		}
		/*2*/
		/*3*/
		b=a;
		b.data[1]=a.data[5];
		b.data[2]=a.data[1];
		b.data[5]=a.data[6];
		b.data[6]=a.data[2];
		temp=0;
		for (i=0;i<8;i++)
			temp+=sq8[i]*b.data[i];
		if (!used[temp])
		{
			used[temp]=true;
			b.deep=a.deep+1;
			b.dad=tail;
			b.rec=3;
			que.push_back(b);
			if (temp==tar)
				break;/*ans*/
		}
		/*3*/
		tail++;
	}
	temp=que.size()-1;
	cout<<que[temp].deep<<endl;
	printway(temp);
	return(0);
}