[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; }
相关文章推荐
- Android面试题收集(有详细答案)
- Spring方法拦截器MethodInterceptor
- 进度条09
- vb24
- 随机十个数排序法排序
- A+
- Unity中游戏暂停和开始怎么实现?
- Spring的AOP是如何实现代理
- EventSystem
- RMAN备份动态性能视图 V$ARCHIVED_LOG
- 16进制
- EventSystem
- Android Volley完全解析(二),使用Volley加载网络图片
- Math中的取整函数
- C# JsonHelper 操作辅助类,拿来直接用
- css简单导航触到主菜单显示子菜单横栏展示
- 学习angularjs遇到的问题
- struts2中form只提交数据不跳转引发的刷新后重复提交表单中数据的问题
- VisionMobile:开发者状况2016年Q1(一)关键提要
- 16进制