1. 程式人生 > >8046 特殊密碼鎖

8046 特殊密碼鎖

有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。


然而讓人頭疼的是,當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的一個按鈕。


當前密碼鎖狀態已知,需要解決的問題是,你至少需要按多少次按鈕,才能將密碼鎖轉變為所期望的目標狀態。


輸入
兩行,給出兩個由0、1組成的等長字串,表示當前/目標密碼鎖狀態,其中0代表凹,1代表凸。
輸出
至少需要進行的按按鈕操作次數,如果無法實現轉變,則輸出impossible。
樣例輸入
011
000
樣例輸出

1

#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
char change(char &x)  //字元0,1轉換 
{
	x=fabs(x-'0'-1)+'0';
	return x;
}
int main()
{
	char a[32]={0},b[32]={0},c[32]={0},sum1=0,sum2=0;
	cin>>a>>c;
	int len=strlen(a);
	for(int i=0;i<len;i++)
	{
		b[i]=a[i];
	}
	//分兩種情況,第一種按第一個按鈕,第二種不按,選擇數量少的 
	change(a[0]);
	change(a[1]);
	sum1++;
	for(int i=1;i<len;i++)
	{
		if(a[i-1]!=c[i-1]) 
		{
			if(i!=len-1) change(a[i+1]);
			change(a[i]);
			change(a[i-1]);
			sum1++;
		}
	}
	if(a[len-1]!=c[len-1]) sum1=100;
	for(int i=1;i<len;i++)
	{
		if(b[i-1]!=c[i-1]) 
		{
			change(b[i]);
			change(b[i-1]);
			sum2++;
		}
	}
	if(b[len-1]!=c[len-1]) sum2=100;
	int ans=sum1>sum2?sum2:sum1;
	if(ans==100) cout<<"impossible";
	else cout<<ans;
	return 0;
}