[noi2001]聪明的打字员 vijos p1673

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int a,b,sa[8],sb[8],q[100005][8],head=0,tail=0;
bool h[10][10][10][10][10][10][7];
inline void mk(int*s){h[s[1]][s[2]][s[3]][s[4]][s[5]][s[6]][s[7]]=true;}
inline bool vis(int*s){return h[s[1]][s[2]][s[3]][s[4]][s[5]][s[6]][s[7]];}
inline bool enq(int*s)
{
	if(!vis(s))
	{
		mk(s);
		s[0]++;
		memcpy(q[tail++],s,sizeof(q[tail]));
		s[0]--;
	}
	int i;
	for(i=1;i<=6;i++)if(q[head-1][i]!=sb[i])break;
	if(i==7)
	{
		printf("%d\n",q[head-1][0]);
		return true;
	}
	return false;
}
int main()
{
	scanf("%d%d",&a,&b);
	if(a==b)
	{
		printf("0\n");
		return 0;
	}
	for(int i=6;i>=1;i--){sa[i]=a%10;a/=10;}
	for(int i=6;i>=1;i--){sb[i]=b%10;b/=10;}
	sa[0]=0;sa[7]=1;
	memcpy(q[tail++],sa,sizeof(sa));
	mk(sa);
	while(head<tail)
	{
		int state[8];
		memcpy(state,q[head++],sizeof(q[head]));
		if(state[7]!=1)
		{
			swap(state[state[7]],state[1]);
			if(enq(state))return 0;
			swap(state[state[7]],state[1]);
		}
		if(state[7]!=6)
		{
			swap(state[state[7]],state[6]);
			if(enq(state))return 0;
			swap(state[state[7]],state[6]);
		}
		if(state[state[7]]!=9)
		{
			state[state[7]]++;
			if(enq(state))return 0;
			state[state[7]]--;
		}
		if(state[state[7]]!=0)
		{
			state[state[7]]--;
			if(enq(state))return 0;
			state[state[7]]++;
		}
		//memcpy(state,q[head],sizeof(q[head]));
		if(state[7]==1 || state[7]==6 || state[state[7]]==sb[state[7]])
		{
			if(state[7]!=1)
			{
				state[7]--;
				if(enq(state))return 0;
				state[7]++;
			}
			if(state[7]!=6)
			{
				state[7]++;
				if(enq(state))return 0;	
				state[7]--;
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ghode_dave/article/details/51339243