OpenJudge 8469:特殊密碼鎖
阿新 • • 發佈:2019-01-06
有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。
然而讓人頭疼的是,當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的一個按鈕。
當前密碼鎖狀態已知,需要解決的問題是,你至少需要按多少次按鈕,才能將密碼鎖轉變為所期望的目標狀態。
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; }