特殊密码锁
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<set>
#include<queue>
#include<bitset>
using namespace std;
#define MAXN 35
int len;
bitset<MAXN> goal;
bitset<MAXN> ori;
int cnt;
int best;
void turn(bitset<MAXN> & b,int i)
{
b.flip(i);
if (i - 1 >= 0)
b.flip(i - 1);
if (i + 1 < len)
b.flip(i + 1);
cnt++;
}
int main()
{
char str[60];
int isFind = 0;
goal.reset();
ori.reset();
scanf("%s", str);
len = strlen(str);
for (int i = 0; i<len; i++)
{
if (str[i] == '1')
{
ori.set(i);
}
}
scanf("%s", str);
int len = strlen(str);
for (int i = 0; i<len; i++)
{
if (str[i] == '1')
{
goal.set(i);
}
}
bitset<MAXN> newBin = ori;
cnt = 0;
turn(newBin, 0);
best = 1 << 30;
for (int i = 1; i < len; i++)
{
if (newBin[i - 1] != goal[i - 1])
{
turn(newBin, i);
}
}
if (newBin == goal)
{
best = cnt;
isFind = 1;
}
newBin = ori;
cnt = 0;
for (int i = 1; i < len; i++)
{
if (newBin[i - 1] != goal[i - 1])
{
turn(newBin, i);
}
}
if (newBin == goal)
{
best = min(cnt,best);
isFind = 1;
}
if (isFind == 0)
{
printf("impossible");
}
else
printf("%d", best);
}