记录编号 46956 评测结果 AAAAAAAAAA
题目名称 [NOI 2001]聪明的打字员 最终得分 100
用户昵称 GravatarTruth.Cirno 是否通过 通过
代码语言 C++ 运行时间 4.836 s
提交时间 2012-10-30 07:46:29 内存使用 13.67 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
using namespace std;

const short SWAPRUL[2]={1,6};
const short RUL[2]={-1,1};

struct quetype
{
	int a[7];
	int tim;
};

bool used[7][10][10][10][10][10][10];
bool tar[7][10][10][10][10][10][10];
queue<quetype> que;

void swap(int& a,int& b)
{
	int temp;
	temp=a;
	a=b;
	b=temp;
}

int main(void)
{
	freopen("clever.in","r",stdin);
	freopen("clever.out","w",stdout);
	quetype a,b;
	int i;
	for (i=1;i<=6;i++)
		scanf("%1d",&a.a[i]);
	a.a[0]=1;
	a.tim=0;
	used[a.a[0]][a.a[1]][a.a[2]][a.a[3]][a.a[4]][a.a[5]][a.a[6]]=true;
	que.push(a);
	for (i=1;i<=6;i++)
		scanf("%1d",&b.a[i]);
	for (i=1;i<=6;i++)
		tar[i][b.a[1]][b.a[2]][b.a[3]][b.a[4]][b.a[5]][b.a[6]]=true;
	if (tar[a.a[0]][a.a[1]][a.a[2]][a.a[3]][a.a[4]][a.a[5]][a.a[6]])
	{
		printf("0\n");
		return(0);
	}
	while (!que.empty())
	{
		a=que.front();
		for (i=0;i<2;i++)
		{
			if (a.a[0]!=SWAPRUL[i])
				if (a.a[a.a[0]]!=a.a[SWAPRUL[i]])
				{
					b=a;
					swap(b.a[b.a[0]],b.a[SWAPRUL[i]]);
					if (!used[b.a[0]][b.a[1]][b.a[2]][b.a[3]][b.a[4]][b.a[5]][b.a[6]])
					{
						b.tim++;
						if (tar[b.a[0]][b.a[1]][b.a[2]][b.a[3]][b.a[4]][b.a[5]][b.a[6]])
						{
							printf("%d\n",b.tim);
							return(0);
						}
						used[b.a[0]][b.a[1]][b.a[2]][b.a[3]][b.a[4]][b.a[5]][b.a[6]]=true;
						que.push(b);
					}
				}
		}
		for (i=0;i<2;i++)
		{
			if (a.a[a.a[0]]+RUL[i]>=0&&a.a[a.a[0]]+RUL[i]<=9)
			{
				b=a;
				b.a[b.a[0]]+=RUL[i];
				if (!used[b.a[0]][b.a[1]][b.a[2]][b.a[3]][b.a[4]][b.a[5]][b.a[6]])
				{
					b.tim++;
					if (tar[b.a[0]][b.a[1]][b.a[2]][b.a[3]][b.a[4]][b.a[5]][b.a[6]])
					{
						printf("%d\n",b.tim);
						return(0);
					}
					used[b.a[0]][b.a[1]][b.a[2]][b.a[3]][b.a[4]][b.a[5]][b.a[6]]=true;
					que.push(b);
				}
			}
		}
		for (i=0;i<2;i++)
		{
			if (a.a[0]+RUL[i]>=1&&a.a[0]+RUL[i]<=6)
			{
				b=a;
				b.a[0]+=RUL[i];
				if (!used[b.a[0]][b.a[1]][b.a[2]][b.a[3]][b.a[4]][b.a[5]][b.a[6]])
				{
					b.tim++;
					used[b.a[0]][b.a[1]][b.a[2]][b.a[3]][b.a[4]][b.a[5]][b.a[6]]=true;
					que.push(b);
				}
			}
		}
		que.pop();
	}
	return(0);
}