1. 程式人生 > >MOOC程式設計與演算法(二)第一週測驗(2017夏季)特殊密碼鎖

MOOC程式設計與演算法(二)第一週測驗(2017夏季)特殊密碼鎖

特殊密碼鎖

特殊密碼鎖

Time Limit: 1000ms
Memory Limit: 1024kB

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

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

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

Input
兩行,給出兩個由0、1組成的等長字串,表示當前/目標密碼鎖狀態,其中0代表凹,1代表凸。
Output


至少需要進行的按按鈕操作次數,如果無法實現轉變,則輸出impossible。
Sample Input
011
000
Sample Output
1

解題思路
只需要考慮是否需要按下第一個燈。
因為如果第一個燈的狀態被確定了,那麼是否需要按下第二個燈也就決定了(如果第一個燈與目標不同,則按下,如果與目標相同,則不按),以此類推;
所以,本題只要分兩種情況:第一個燈被按下和沒有被按下

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; typedef long long ll; const int INF = 0x3f3f3f3f; char s[35], aim[35], s0[35];//s0當前狀態;aim目標狀態;s從s0到aim的中間狀態 void pushdown(int i, char ch[])//按下第i個開關 { if (i == 0) { if (ch[i] == '0') ch[i] = '1'; else ch[i] = '0'; if (ch[i + 1] == '0'
) ch[i + 1] = '1'; else ch[i + 1] = '0'; } else if (i == strlen(aim) - 1) { if (ch[i] == '0') ch[i] = '1'; else ch[i] = '0'; if (ch[i - 1] == '0') ch[i - 1] = '1'; else ch[i - 1] = '0'; } else { if (ch[i] == '0') ch[i] = '1'; else ch[i] = '0'; if (ch[i + 1] == '0') ch[i + 1] = '1'; else ch[i + 1] = '0'; if (ch[i - 1] == '0') ch[i - 1] = '1'; else ch[i - 1] = '0'; } } int main(void) { int flag1, flag2, cnt1, cnt2; flag1 = flag2 = cnt1 = cnt2 = 0; cin >> s0 >> aim; strcpy(s, s0); cnt1 = 1; pushdown(0, s); for (int i = 1;i < strlen(aim);++i) { if (s[i - 1] != aim[i - 1]) pushdown(i, s), cnt1++; } if (strcmp(s, aim) != 0) flag1 = 1; strcpy(s, s0); cnt2 = 0; for (int i = 1;i < strlen(aim);++i) { if (s[i - 1] != aim[i - 1]) pushdown(i, s), cnt2++; } if (strcmp(s, aim) != 0) flag2 = 1; if (flag1&&flag2) cout << "impossible"; else if (flag1) cout << cnt2; else if (flag2) cout << cnt1; else cout << min(cnt1, cnt2); return 0; }