声明2个性质:
1. 一个按钮最多摁一次
2. 如果确定了第一个按钮是否被摁,则其他按钮是否被摁也被确定。
#include <iostream>
#include <string>
#include <memory.h>
#include <stdio.h>
using namespace std;
char now[35], target[35];
void Flip( char &tmp )
{
if( tmp == '1' )
tmp = '0';
else
tmp = '1';
}
int main()
{
memset(now, 0, sizeof(now));
memset(target, 0, sizeof(target));
gets(now);
gets(target);
int len = strlen(now);
int ans1 = 1;
char tmp[35];
strcpy(tmp, now);
Flip( tmp[0] );
if( len > 1 )
Flip( tmp[1] );
for( int i = 1; i < len; i++ )
{
if( tmp[i-1] != target[i-1] )
{
ans1++;
Flip( tmp[i-1] );
Flip( tmp[i] );
if( i < len-1 )
Flip( tmp[i+1] );
}
}
if( tmp[len-1] != target[len-1] )
ans1 = 50;
int ans2 = 0;
for( int i = 1; i < len; i++ )
{
if( now[i-1] != target[i-1] )
{
ans2++;
Flip( now[i-1] );
Flip( now[i] );
if( i < len-1 )
Flip( now[i+1] );
}
}
if( now[len-1] != target[len-1] )
ans2 = 50;
int ans = min(ans1, ans2);
if( ans < 50 )
cout << ans << endl;
else
cout << "impossible" << endl;
return 0;
}