题目:
使用bitset更加方便
bitset:c++ bitset类用法_Liam Q的专栏-CSDN博客_bitset c++https://blog.csdn.net/qll125596718/article/details/6901935
思路:
最左边(和最右边)按下后只会改变两个按钮的状态,其他位置按下会改变三个按钮状态,按钮按两次即可复原
分为两种情况:①最左边按下 ②最左边不按下(最右边和最左边只选一个即可)
按照顺序将第i处按钮与目标状态比较,如果i处与目标状态不同,则按下i+1处的按钮(即下一个),以保证已经按过的按钮状态正常,同时能够将i处改为目标状态。
代码:
#include<iostream>
#include<algorithm>
#include<bitset>
#include<cstring>
using namespace std;
int main(){
string line;
bitset<32> lock;
int mint=1<<30; //一个大数
cin>>line;
bitset<32> startlock(line);
cin>>line;
bitset<32> targetlock(line);
int n=line.size();
for(int p=0;p<=1;++p) //最左边按下与否,0表示最左边不按下
{
lock=startlock; //lock为当前锁的状态
int t=0;
int next=p; //next表示是否要按下下一个按钮,一开始p=0,最左边第一个不按下,那么 第二个也不能按下以保证第一个不按下的状态
for(int i=0;i<n;i++)
{
if(next==1)
{
if(i>0)lock.flip(i-1); //按下之后要改变附近按钮的状态
lock.flip(i);
if(i<n-1)lock.flip(i+1);
++t; //次数+1
}
if(lock[i]!=targetlock[i])
next=1; //如果第i处和目标不同,则按下i+1处
else next=0;
}
if(lock==targetlock)
mint=min(t,mint);
}
if(mint==1<<30)cout<<"impossible";
else cout<<mint;
return 0;
}