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; }