算法训练 OpenJudge 8469
2017-01-29 23:38
337 查看
8469:特殊密码锁
总时间限制: 1000ms 内存限制: 1024kB描述
有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。
然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。
当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。
输入两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。
输出至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。
样例输入
011 000
样例输出
1
//运用枚举的方法
#include <iostream> #include <cstdio> #include <cstring> using namespace std; void oj_1_1(){ char code[35],result_status[35]; cin>>code;//当前密码锁状态 cin>>result_status;//目标状态 int len=strlen(code); int cnt=0; char tmp[35];//存储密码锁变化的中间状态 strcpy(tmp,code);//初始化 /** * 先判断首位与目标状态的首位时候相同,根据不同的状况进行处理 */ if(tmp[0]==result_status[0]){ tmp[2]=(tmp[2]=='1')?'0':'1';//前两个都按下 cnt+=2; for(int i=1;i<len-1;++i){ if(tmp[i]!=result_status[i]){ int pos=i+1; if(pos+1<len) tmp[pos+1]=(tmp[pos+1]=='1')?'0':'1'; tmp[pos]=(tmp[pos]=='1')?'0':'1'; tmp[pos-1]=(tmp[pos-1]=='1')?'0':'1'; cnt++; } } if(tmp[len-1]==result_status[len-1]){ cout<<cnt<<endl; return; } strcpy(tmp,code); cnt=0; for(int i=1;i<len-1;++i){ if(tmp[i]!=result_status[i]){ int pos=i+1; if(pos+1<len) tmp[pos+1]=(tmp[pos+1]=='1')?'0':'1'; tmp[pos]=(tmp[pos]=='1')?'0':'1'; tmp[pos-1]=(tmp[pos-1]=='1')?'0':'1'; cnt++; } } if(tmp[len-1]==result_status[len-1]){ cout<<cnt<<endl; return; } }else{ tmp[0]=(tmp[0]=='1')?'0':'1';//只按第一个 tmp[1]=(tmp[1]=='1')?'0':'1'; cnt++; for(int i=1;i<len-1;++i){ if(tmp[i]!=result_status[i]){ int pos=i+1; if(pos+1<len) tmp[pos+1]=(tmp[pos+1]=='1')?'0':'1'; tmp[pos]=(tmp[pos]=='1')?'0':'1'; tmp[pos-1]=(tmp[pos-1]=='1')?'0':'1'; cnt++; } } if(tmp[len-1]==result_status[len-1]){ cout<<cnt<<endl; return; } strcpy(tmp,code); cnt=0; tmp[0]=(tmp[0]=='1')?'0':'1'; tmp[1]=(tmp[1]=='1')?'0':'1';//只按第二个 tmp[2]=(tmp[2]=='1')?'0':'1'; cnt++; for(int i=1;i<len-1;++i){ if(tmp[i]!=result_status[i]){ int pos=i+1; if(pos+1<len) tmp[pos+1]=(tmp[pos+1]=='1')?'0':'1'; tmp[pos]=(tmp[pos]=='1')?'0':'1'; tmp[pos-1]=(tmp[pos-1]=='1')?'0':'1'; cnt++; } } if(tmp[len-1]==result_status[len-1]){ cout<<cnt<<endl; return; } } cout<<"impossible"<<endl; } int main(){ oj_1_1(); return 0; }
相关文章推荐
- py2.7 : 《机器学习实战》 朴素贝叶斯 1.12号 4.5.3 训练算法:从词向量计算概率
- 算法训练 矩阵乘方
- 蓝桥杯 算法训练 6-1 递归求二项式系数值
- 蓝桥杯 ALGO-122 算法训练 未名湖边的烦恼
- 蓝桥杯算法训练——lift and throw
- 算法-蓝桥杯-入门训练 圆的面积 (JAVA)
- 蓝桥杯_算法训练 麦森数
- 算法训练 阶乘
- 蓝桥杯 算法训练 未名湖边的烦恼
- 算法训练 装箱问题
- 整数算法的简单训练
- 算法训练 猴子分苹果
- 算法训练 友好数
- 蓝桥杯 算法训练 字符串变换
- 蓝桥杯—— 算法训练 图形显示
- 蓝桥杯 ALGO-123 算法训练 A+B problem
- 蓝桥杯算法—— 算法训练 前缀表达式
- 蓝桥杯练习系统习题-算法训练4
- 算法训练 特殊的数字四十
- 算法训练 传纸条