题目:

http://cdqz.openjudge.cn/noip/1012/

时间限制:
20000ms
内存限制:
128000kB
描述

阿兰是某机密部门的打字员,她现在接到一个任务:需要在一天之内输入几百个长度同定为6的密码。当然,她希望输入的过程中敲击键盘的总次数越少越好..

不幸的是,出于保密的需要,该部门用于输入密码的键盘是特殊设计的,键盘上没有数字键,而只有以下六个键:Swap0.Swapl,up,down,Left,Right。为了说明这6个键的作用,我们先定义录入区的6个位置的编号,从左至右依次为l,2,3,4,5,6。下面列出每个键的作用:

Swap0:按Swap0,光标位置不变,将光标所在位置的数字与录入区的l号位置的数字(左起第一个数字)交换。如果光标已经处在录入区的l号位置,则按Swap0键之后.录入区的数字不变;

Swapl:按Swapl,光标位置不变,将光标所在位置的数字与录人区的6号位置的数字(左起第六个数字)交换。如果光标已经处在录人区的6号位置,则按Swapl键之后.录人区的数字不变;

Up:按up,光标位置不变,将光标所在位置的数字加1(除非该数字是9)。例如,如果光标所在位置的数字为2,按up之后,该处的数字变为3;如果该处数字为9,则按up之后,数字不变,光标位置也不变;

down:按Down,光标位置不变,将光标所在位置的数宁减1(除非该数字是0)。如果该处数字为0,则按Down之后,数字不变,光标位置也不变;

Left:按Len,光标左移一个位置,如果光标已经在录入区的l号位置(左起笫一个位置)上,则光标不动;

Right:按Right,光标右移一个位置,如果光标已经在录入医的6号位置(左起第六个位置)上,则光标不动。当然,为了使这样的键盘发挥作用,每次录入密码之前,录入区总会随机出现一个长度为6的初始密码.而且光标固定出现在1号位置上。当巧妙地使用上述六个特殊键之后,可以得到目标密码,这时光标允许停在任何一个位置。

现在,阿兰需要你的帮助,编写一个程序,求出录人一个密码需要的最少的击键次数。

输入
仪一行,含有两个长度为6的数,前者为初始密码,后者为目标密码,两个密码之间用一个空格隔开。
输出
仅一行,含有一个正整数,为最少需要的击键次数。
样例输入
123456 654321
样例输出11 题解:  赤裸裸的bfs…………………………但需要一定的优化:1、改变每次进行扩展时的操作顺序。2、加判重。3、双向bfs。   我只用了第二种优化………………好像比较慢………………不过勉强可以过了……………… 
View Code

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 #include<queue>
  5
  6 using namespace std;
  7
  8 int shi[10],s,e;
  9
 10 bool ma[100000001];
 11
 12 struct state
 13 {
 14        int v,step;
 15        state()
 16        {
 17                v=step=0;
 18        }
 19        state(int a,int b)
 20        {
 21                  v=a;step=b;
 22        }
 23 };
 24
 25 queue<state> que;
 26
 27 bool work1(int v,int p,int s)
 28 {
 29      if (p==6) return false;
 30      int newv=v;
 31      newv=newv-v / shi[6] * shi[6];
 32      newv=newv-v / shi[p] % 10 * shi[p];
 33      newv=newv+v / shi[p] % 10 * shi[6];
 34      newv=newv+v / shi[6] * shi[p];
 35      if (newv==e)
 36      {
 37                  printf("%d\n",s+1);
 38                  return true;
 39      }
 40      if (!ma[newv*10+p])
 41      {
 42                         ma[newv*10+p]=true;
 43                         que.push(state(newv*10+p,s+1));
 44      }
 45      return false;
 46 }
 47
 48 bool work2(int v,int p,int s)
 49 {
 50      if (p==1) return false;
 51      int newv=v;
 52      newv=newv-v % 10;
 53      newv=newv-v / shi[p] % 10 * shi[p];
 54      newv=newv+v / shi[p] % 10;
 55      newv=newv+v % 10 * shi[p];
 56      if (newv==e)
 57      {
 58                  printf("%d\n",s+1);
 59                  return true;
 60      }
 61      if (!ma[newv*10+p])
 62      {
 63                         ma[newv*10+p]=true;
 64                         que.push(state(newv*10+p,s+1));
 65      }
 66      return false;
 67 }
 68
 69 bool work3(int v,int p,int s)
 70 {
 71      if (v / shi[p] % 10==9) return false;
 72      int newv=v+shi[p];
 73      if (newv==e)
 74      {
 75                  printf("%d\n",s+1);
 76                  return true;
 77      }
 78      if (!ma[newv*10+p])
 79      {
 80                         ma[newv*10+p]=true;
 81                         que.push(state(newv*10+p,s+1));
 82      }
 83      return false;
 84 }
 85
 86 bool work4(int v,int p,int s)
 87 {
 88      if (v / shi[p] % 10==0) return false;
 89      int newv=v-shi[p];
 90      if (newv==e)
 91      {
 92                  printf("%d\n",s+1);
 93                  return true;
 94      }
 95      if (!ma[newv*10+p])
 96      {
 97                         ma[newv*10+p]=true;
 98                         que.push(state(newv*10+p,s+1));
 99      }
100      return false;
101 }
102
103 bool work5(int v,int p,int s)
104 {
105      if (p==1) return false;
106      int newp=p-1;
107      if (!ma[v*10+newp])
108      {
109                         ma[v*10+newp]=true;
110                         que.push(state(v*10+newp,s+1));
111      }
112      return false;
113 }
114
115 bool work6(int v,int p,int s)
116 {
117      if (p==6) return false;
118      int newp=p+1;
119      if (!ma[v*10+newp])
120      {
121                         ma[v*10+newp]=true;
122                         que.push(state(v*10+newp,s+1));
123      }
124      return false;
125 }
126 int main()
127 {
128     scanf("%d%d",&s,&e);
129     if (s==e)
130     {
131              printf("0\n");
132              return 0;
133     }
134     shi[1]=1;
135     for (int a=2;a<=6;a++)
136     shi[a]=shi[a-1]*10;
137     que.push(state(s*10+6,0));
138     ma[s*10+6]=true;
139     while (que.size())
140     {
141           state now=que.front();
142           que.pop();
143           int v=now.v / 10;
144           int p=now.v % 10;
145           if (work1(v,p,now.step)) break;
146           if (work2(v,p,now.step)) break;
147           if (work3(v,p,now.step)) break;
148           if (work4(v,p,now.step)) break;
149           if (work5(v,p,now.step)) break;
150           if (work6(v,p,now.step)) break;
151     }
152
153     return 0;
154 }

 

转载于:https://www.cnblogs.com/zhonghaoxi/archive/2012/05/25/2518528.html

CDQZ_Training 2012-05-24 聪明的打字员相关推荐

  1. http://www.cnblogs.com/tornadomeet/archive/2012/05/24/2515980.html

    转载: Deep Learning(深度学习): ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习):一 ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰 ...

  2. 雨林木风 GhostXP SP3 快速安全装机版 2012.05

    [ghostxp系统下载]提示您:此软件经过我们检查,是无病毒无插件软件,请放心使用.如您下载安装过程中或安装后发现有插件情况,请及时向我们举报,感谢您的支持与理解! 雨林木风 GhostXP SP3 ...

  3. 番茄花园 GhostXP SP3 电脑城快速装机版 2012.05

    [ghostxp系统下载]提示您:此软件经过我们检查,是无病毒无插件软件,请放心使用.如您下载安装过程中或安装后发现有插件情况,请及时向我们举报,感谢您的支持与理解! ================ ...

  4. 新萝卜家园 ghost xp sp3 电脑城稳定版 2012.05+

    新萝卜家园 ghost xp sp3 电脑城稳定版 2012.05+ 文件名: LB_GhostXP3_v2012.02.iso MD5: C00B1913D725C0188D62D6D149AEB6 ...

  5. 最近任务-2012.05.14

    最近任务: 本周:3个英文短文,30新单词,3个C程序,5个新CSS属性. 2012.05.14(星期一)---2012.05.16(星期三) 1.复习网络各层概念 复习网络TCP/IP协议 2012 ...

  6. http://www.cnblogs.com/ITtangtang/archive/2012/05/21/2511749.html

    http://www.cnblogs.com/ITtangtang/archive/2012/05/21/2511749.html http://blog.sina.com.cn/s/blog_538 ...

  7. http://www.cnblogs.com/xia520pi/archive/2012/05/16/2504205.html

    http://www.cnblogs.com/xia520pi/archive/2012/05/16/2504205.html http://www.cnblogs.com/madyina/p/370 ...

  8. English Learning - L3 综合练习 4 VOA-Food 2023.05.24 周三

    English Learning - L3 综合练习 4 VOA-Food 2023.05.24 周三 句 1 句 2 Support 拓展 养家,养家之人 句 3 mustard 芥末 expect ...

  9. 项目Beta冲刺(团队)——05.24(2/7)

    项目Beta冲刺(团队)--05.24(2/7) 格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Beta冲刺(团队) 团队名称:为了交项目干杯 作业目标:记录Beta敏捷冲刺第2 ...

最新文章

  1. 基于双门限法的端点检测
  2. Eclipse中修改tomcat内存大小
  3. 【ThinkPHP系列篇】Thinkphp框架的CURD操作(三)
  4. pythondict(zip())_python基础:zip和dict详解
  5. 75 jsp基础语法汇总
  6. PLSQL 安装+配置( Oracle数据库连接工具 )
  7. 01.神经网络和深度学习 W4.深层神经网络(作业:建立你的深度神经网络+图片猫预测)
  8. php 计算指定年份的周总数与及第几周的开始日期和结束日期(从周一开始)
  9. VS2015 IIS Express 无法启动 解决办法(转)
  10. Python:程序员在每天不同时间发微信消息给女友
  11. flutter SlideTransition实现平移动画
  12. pytest的fixture传参数
  13. FPGA学无止境(目录篇)
  14. tensorflow安装以及在Anaconda中安装使用
  15. SQL数据库安装-数据库的下载
  16. 查询和预测影响因子,这篇文章就够了
  17. 测试点击屏幕次数的软件_显示器响应时间测试软件
  18. java写出麻将和牌的算法,麻将胡牌算法
  19. 仓库如何盘点?使用盘点机盘点有什么好处?仓库盘点方法?
  20. java浮点型数据的比较

热门文章

  1. Python中的相对文件路径的调用
  2. NLP系列学习:CRF条件随机场(2)
  3. 用TensorFlow做Kaggle“手写识别”达到98%准确率-详解
  4. 论文Algorithms for non-negative matrix Factorization
  5. 新版手机浏览器_夸克浏览器发布全新3.0版,AI技术创新智能化信息服务
  6. python 网页版笔记_系统学习下python网络爬虫 笔记一
  7. 安装python缺少dll_python报错DLL load failed:找不到模块怎么解决?
  8. Jrebel 激活方式
  9. Android模拟器中sd卡的创建和文件的上传
  10. java 左侧菜单栏收缩_页面左侧可收缩菜单案例