MOOC程式設計與演算法(二)第一週測驗(2017夏季)特殊密碼鎖
阿新 • • 發佈:2019-02-17
特殊密碼鎖
特殊密碼鎖
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;
}