WUST Online Judge - 2104: 特殊密碼鎖
阿新 • • 發佈:2018-06-12
需要 oar n) clas out abs ted acc false
2104: 特殊密碼鎖
Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld
Submitted: 153 Accepted: 22
[Submit][Status][Web Board]
Description
有一種特殊的二進制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。
然而讓人頭疼的是,當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的一個按鈕。
當前密碼鎖狀態已知,需要解決的問題是,你至少需要按多少次按鈕,才能將密碼鎖轉變為所期望的目標狀態。
Input
多組測試數據,每組測試數據輸入占兩行,給出兩個由0、1組成的等長字符串,表示當前/目標密碼鎖狀態,其中0代表凹,1代表凸。
Output
每組測試數據輸出占一行。輸出至少需要進行的按按鈕操作次數,如果無法實現轉變,則輸出impossible。
Sample Input
011 000
Sample Output
1
代碼如下:
#include <stdio.h> #include <string.h> #include <math.h> int main() { int i, j, len; int flag, cnt1, cnt2; char s1[30], s2[30], str[30]; while (scanf("%s %s", s1, s2) != EOF) { fflush(stdin); flag = 1000; cnt1 = cnt2 = 0; strcpy(str, s1); len = strlen(s1); for (i = 1; i < len; i++) { if (s1[i - 1] != s2[i - 1]) { if (s1[i - 1] == ‘1‘) s1[i - 1] = ‘0‘; else s1[i - 1] = ‘1‘; if (s1[i] ==‘1‘) s1[i] = ‘0‘; else s1[i] = ‘1‘; if (i + 1 < len) { if (s1[i + 1] == ‘1‘) s1[i + 1] = ‘0‘; else s1[i + 1] = ‘1‘; } cnt1++; } } if (s1[len - 1] == s2[len - 1]) flag = cnt1; cnt2 = 1; strcpy(s1, str); if (s1[0] == ‘1‘) s1[0] = ‘0‘; else s1[0] = ‘1‘; if (s1[1]==‘1‘) s1[1] = ‘0‘; else s1[1] = ‘1‘; for (i = 1; i < len; i++) { if (s1[i - 1] != s2[i - 1]) { if (s1[i - 1] == ‘1‘) s1[i - 1] = ‘0‘; else s1[i - 1] = ‘1‘; if (s1[i] == ‘1‘) s1[i] = ‘0‘; else s1[i] = ‘1‘; if(i + 1 < len) { if(s1[i + 1] == ‘1‘) s1[i + 1] = ‘0‘; else s1[i + 1] = ‘1‘; } cnt2++; } } if (s1[len - 1] == s2[len - 1]) if (flag > cnt2) flag = cnt2; if (flag == 1000) printf("impossible\n"); else printf("%d\n", flag); } return 0; }
WUST Online Judge - 2104: 特殊密碼鎖