1. 程式人生 > >OpenJudge 8469:特殊密碼鎖

OpenJudge 8469:特殊密碼鎖

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

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

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

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

列舉,核心考慮第一個要不要變

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

char a[35],b[35],c[35];
int len;

void switchs(int i){                    //改變一個數,要改變其前後 
	a[i-1]=a[i-1]=='1'?'0':'1';
	a[i]=a[i]=='1'?'0':'1';
	if(i<len-1)a[i+1]=a[i+1]=='1'?'0':'1';
}
int main(){
	while(cin>>c>>b){
		len=strlen(c);
		int flag=0;
		int count1=0,count2=1,ans1=1e8,ans2=1e8;
		strcpy(a,c);
		for(int i=1;i<len;i++){        //第一個不改變 
			if(a[i-1]!=b[i-1]){
				switchs(i);
				count1++;
			}
		} 
		if(strcmp(a,b)==0){
		ans1=count1;
		flag=1;}
		strcpy(a,c);
		a[0]=a[0]=='1'?'0':'1';        //第一個改變 
		a[1]=a[1]=='1'?'0':'1';
		for(int i=1;i<len;i++){
			if(a[i-1]!=b[i-1]){
				switchs(i);
				count2++;
			}
		} 
		if(strcmp(a,b)==0){
		ans2=count2;
		flag=1;}
		if(flag){
			cout<<min(ans1,ans2)<<endl;
		}
		else cout<<"impossible"<<endl;
		//cout<<ans1<<" "<<ans2;
	}
	return 0;
}