有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。
然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。
当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。
011 000样例输出
1
枚举,核心考虑第一个要不要变
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char a[35],b[35],c[35];
int len;
void switchs(int i){ //改变一个数,要改变其前后
a[i-1]=a[i-1]=='1'?'0':'1';
a[i]=a[i]=='1'?'0':'1';
if(i<len-1)a[i+1]=a[i+1]=='1'?'0':'1';
}
int main(){
while(cin>>c>>b){
len=strlen(c);
int flag=0;
int count1=0,count2=1,ans1=1e8,ans2=1e8;
strcpy(a,c);
for(int i=1;i<len;i++){ //第一个不改变
if(a[i-1]!=b[i-1]){
switchs(i);
count1++;
}
}
if(strcmp(a,b)==0){
ans1=count1;
flag=1;}
strcpy(a,c);
a[0]=a[0]=='1'?'0':'1'; //第一个改变
a[1]=a[1]=='1'?'0':'1';
for(int i=1;i<len;i++){
if(a[i-1]!=b[i-1]){
switchs(i);
count2++;
}
}
if(strcmp(a,b)==0){
ans2=count2;
flag=1;}
if(flag){
cout<<min(ans1,ans2)<<endl;
}
else cout<<"impossible"<<endl;
//cout<<ans1<<" "<<ans2;
}
return 0;
}