CDQZ_Training 2012-05-24 聪明的打字员
题目:
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。 我只用了第二种优化………………好像比较慢………………不过勉强可以过了………………
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 聪明的打字员相关推荐
- http://www.cnblogs.com/tornadomeet/archive/2012/05/24/2515980.html
转载: Deep Learning(深度学习): ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习):一 ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰 ...
- 雨林木风 GhostXP SP3 快速安全装机版 2012.05
[ghostxp系统下载]提示您:此软件经过我们检查,是无病毒无插件软件,请放心使用.如您下载安装过程中或安装后发现有插件情况,请及时向我们举报,感谢您的支持与理解! 雨林木风 GhostXP SP3 ...
- 番茄花园 GhostXP SP3 电脑城快速装机版 2012.05
[ghostxp系统下载]提示您:此软件经过我们检查,是无病毒无插件软件,请放心使用.如您下载安装过程中或安装后发现有插件情况,请及时向我们举报,感谢您的支持与理解! ================ ...
- 新萝卜家园 ghost xp sp3 电脑城稳定版 2012.05+
新萝卜家园 ghost xp sp3 电脑城稳定版 2012.05+ 文件名: LB_GhostXP3_v2012.02.iso MD5: C00B1913D725C0188D62D6D149AEB6 ...
- 最近任务-2012.05.14
最近任务: 本周:3个英文短文,30新单词,3个C程序,5个新CSS属性. 2012.05.14(星期一)---2012.05.16(星期三) 1.复习网络各层概念 复习网络TCP/IP协议 2012 ...
- 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 ...
- 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 ...
- English Learning - L3 综合练习 4 VOA-Food 2023.05.24 周三
English Learning - L3 综合练习 4 VOA-Food 2023.05.24 周三 句 1 句 2 Support 拓展 养家,养家之人 句 3 mustard 芥末 expect ...
- 项目Beta冲刺(团队)——05.24(2/7)
项目Beta冲刺(团队)--05.24(2/7) 格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Beta冲刺(团队) 团队名称:为了交项目干杯 作业目标:记录Beta敏捷冲刺第2 ...
最新文章
- 基于双门限法的端点检测
- Eclipse中修改tomcat内存大小
- 【ThinkPHP系列篇】Thinkphp框架的CURD操作(三)
- pythondict(zip())_python基础:zip和dict详解
- 75 jsp基础语法汇总
- PLSQL 安装+配置( Oracle数据库连接工具 )
- 01.神经网络和深度学习 W4.深层神经网络(作业:建立你的深度神经网络+图片猫预测)
- php 计算指定年份的周总数与及第几周的开始日期和结束日期(从周一开始)
- VS2015 IIS Express 无法启动 解决办法(转)
- Python:程序员在每天不同时间发微信消息给女友
- flutter SlideTransition实现平移动画
- pytest的fixture传参数
- FPGA学无止境(目录篇)
- tensorflow安装以及在Anaconda中安装使用
- SQL数据库安装-数据库的下载
- 查询和预测影响因子,这篇文章就够了
- 测试点击屏幕次数的软件_显示器响应时间测试软件
- java写出麻将和牌的算法,麻将胡牌算法
- 仓库如何盘点?使用盘点机盘点有什么好处?仓库盘点方法?
- java浮点型数据的比较
热门文章
- Python中的相对文件路径的调用
- NLP系列学习:CRF条件随机场(2)
- 用TensorFlow做Kaggle“手写识别”达到98%准确率-详解
- 论文Algorithms for non-negative matrix Factorization
- 新版手机浏览器_夸克浏览器发布全新3.0版,AI技术创新智能化信息服务
- python 网页版笔记_系统学习下python网络爬虫 笔记一
- 安装python缺少dll_python报错DLL load failed:找不到模块怎么解决?
- Jrebel 激活方式
- Android模拟器中sd卡的创建和文件的上传
- java 左侧菜单栏收缩_页面左侧可收缩菜单案例