思路:
和熄灯问题(poj p1222)很像,只要枚举第一个按钮是否按下的两种情况即可。并且,第一种情况确定了后面情况也确定了。
代码如下:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
//枚举第一个按钮是否按下的两种情况即可。对于指定的一种情况,后面的情况也随之确定了
int orilock;
int lock;
int destlock;
void setbit(int& n, int i, int v)//将n的第i位置为v
{
if (v)
n |= (1 << i);
else
n &= ~(1 << i);
}
void flipbit(int& n, int i)//对n的第i位取反
{
n ^= (1 << i);
}
int getbit(int n, int i)//取n的第i位
{
return (n >> i) & 1;
}
int main()
{
char line[40];
destlock = lock = orilock = 0;
cin >> line;
int n = strlen(line);
for (int i = 0; i < n; ++i)
setbit(orilock, i, line[i] - '0');
cin >> line;
for (int i = 0; i < n; ++i)
setbit(destlock, i, line[i] - '0');
int mintimes = 1 << 30 ;
for (int p = 0; p < 2; ++p)//第一个按钮有两种可能,按或者不按
{
lock = orilock;
int times = 0;
int curbutton = p;
for (int i = 0; i < n; ++i)
{
if (curbutton)
{
++times;
if (i > 0)
flipbit(lock, i - 1);
flipbit(lock, i);
if (i < n - 1)
flipbit(lock, i + 1);
}
if (getbit(lock, i) != getbit(destlock, i))
curbutton = 1;
else
curbutton = 0;
}
if (lock == destlock)
mintimes = min(mintimes, times);
}
if (mintimes == 1 << 30)
cout << "impossible" << endl;
else
cout << mintimes << endl;
return 0;
}