您的位置:首页 > 其它

[noi2001]聪明的打字员 vijos p1673

2016-05-07 18:10 274 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: