8046 特殊密碼鎖
阿新 • • 發佈:2019-01-28
有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。
然而讓人頭疼的是,當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的一個按鈕。
當前密碼鎖狀態已知,需要解決的問題是,你至少需要按多少次按鈕,才能將密碼鎖轉變為所期望的目標狀態。
輸入
兩行,給出兩個由0、1組成的等長字串,表示當前/目標密碼鎖狀態,其中0代表凹,1代表凸。
輸出
至少需要進行的按按鈕操作次數,如果無法實現轉變,則輸出impossible。
樣例輸入
011
000
樣例輸出
然而讓人頭疼的是,當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的一個按鈕。
當前密碼鎖狀態已知,需要解決的問題是,你至少需要按多少次按鈕,才能將密碼鎖轉變為所期望的目標狀態。
輸入
兩行,給出兩個由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; }