openjudge-特殊密碼鎖
阿新 • • 發佈:2019-02-19
描述
有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。
然而讓人頭疼的是,當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的一個按鈕。
當前密碼鎖狀態已知,需要解決的問題是,你至少需要按多少次按鈕,才能將密碼鎖轉變為所期望的目標狀態。
輸入
兩行,給出兩個由0、1組成的等長字串,表示當前/目標密碼鎖狀態,其中0代表凹,1代表凸。
輸出
至少需要進行的按按鈕操作次數,如果無法實現轉變,則輸出impossible。
樣例輸入
011
000
樣例輸出
1
#include<memory>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 32
using namespace std;
void SetBit(char & c)
{
if(c == '0') c = '1';
else c = '0';
}
void Change(char switchs[],int i,int length)
{
if ( i-1 >= 0 ) SetBit(switchs[i-1]);
SetBit(switchs[i]);
if( i+1 < length) SetBit(switchs[i+1]);
}
int main()
{
char oriswitchs[N];
char switchs[N];
char aim[N];
int num1 = 0,num2 = 0,length = 0;
int min_num=0;
bool tag = false;
cin >> oriswitchs >> aim;
length = strlen (oriswitchs);
for(int k = 0 ; k < 2 ; ++k)
{ //列舉首位是否操作
memcpy(switchs,oriswitchs,sizeof(oriswitchs));
if(k) //首位不翻轉
{
for(int i = 1; i < length ; ++i )
{
if(switchs[i-1] != aim[i-1])
{
Change(switchs,i,length);
++num1;
}
}
if(switchs[length-1] == aim[length-1]) tag=true;
}
else //首位翻轉
{
Change(switchs,0,length);
++num2;
for(int j = 1; j < length ; ++j )
{
if(switchs[j-1] != aim[j-1])
{
Change(switchs,j,length);
++num2;
}
}
if(switchs[length-1] == aim[length-1]) tag=true;
}
}
if(tag)
{
min_num = min(num1,num2);
cout << min_num;
}
else
{
cout << "impossible";
}
return 0;
}