代码可能有点搓,绝对原创!
描述
有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。
然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。
当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。
输入
两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。
输出
至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。
样例输入
011 000
样例输出
1
#include <iostream>
#include <string>
using namespace std;
int PressCount(string passwndold,string passwndnew)
{
if(passwndold==passwndnew) return 0;
if(passwndnew.length()!=passwndold.length()) return -1;
int presscount=0,k=0;
for(int i=0;i<passwndold.length();i++)
{
if(passwndold[i]==passwndnew[i])
{
continue;
}
else
{
if(i==(passwndold.length()-1))
{
presscount=-1;
return presscount;
}
else if(i==(passwndold.length()-2))
{
if(passwndold[i+1]!=passwndnew[i+1])
{
presscount++;
}
else if(passwndold[i+1]==passwndnew[i+1])
{
presscount=-1;
}
return presscount;
}
else if(i==(passwndold.length()-3))
{
if((passwndold[i+1]!=passwndnew[i+1])&&(passwndold[i+2]!=passwndnew[i+2]))
{
presscount++;
}
else if((passwndold[i+1]!=passwndnew[i+1])&&(passwndold[i+2]==passwndnew[i+2]))
{
presscount=-1;
}
else if((passwndold[i+1]==passwndnew[i+1])&&(passwndold[i+2]!=passwndnew[i+2]))
{
if(passwndold.length()==3)
{
presscount+=2;
}
else
{
presscount=-1;
}
}
else if((passwndold[i+1]==passwndnew[i+1])&&(passwndold[i+2]==passwndnew[i+2]))
{
presscount=-1;
}
return presscount;
}
//if((passwndold[i+1]!=passwndnew[i+1])&&(passwndold[i+2]!=passwndnew[i+2]))
//{
// presscount++;
// i=i+3;
// continue;
//}
if(passwndold[i+1]=='0')
{
passwndold[i+1]='1';
presscount++;
}
else
{
passwndold[i+1]='0';
presscount++;
}
if(passwndold[i]=='0')
{
passwndold[i]='1';
}
else
{
passwndold[i]='0';
}
if(passwndold[i+2]=='0')
{
passwndold[i+2]='1';
}
else
{
passwndold[i+2]='0';
}
}
}
return presscount;
}
int main()
{
string passwndold,passwndnew;
cin>>passwndold;
cin>>passwndnew;
//考虑第一个按钮的特殊性
int a=0,b=0;
a=PressCount(passwndold,passwndnew);
if(passwndold[0]=='0')
{
passwndold[0]='1';
if(passwndold[1]=='0')
{
passwndold[1]='1';
}
else
{
passwndold[1]='0';
}
}
else
{
passwndold[0]='0';
if(passwndold[1]=='0')
{
passwndold[1]='1';
}
else
{
passwndold[1]='0';
}
}
b=PressCount(passwndold,passwndnew);
b+=1;
if((a==-1)&&(b==0))
{
cout<<"impossible"<<endl;
}
else if((a!=-1)&&(b==0))
{
cout<<a<<endl;
}
else if((a==-1)&&(b!=0))
{
cout<<b<<endl;
}
else if((a!=-1)&&(b!=0))
{
if(a<=b)
{
cout<<a<<endl;
}
else
{
cout<<b<<endl;
}
}
// cout<<passwndold<<endl;
return 0;
}