WUST Online Judge - 2104: 特殊密码锁

Posted mcr-tcp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WUST Online Judge - 2104: 特殊密码锁相关的知识,希望对你有一定的参考价值。

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
");
        else printf("%d
", flag);
    }
    return 0;
}


以上是关于WUST Online Judge - 2104: 特殊密码锁的主要内容,如果未能解决你的问题,请参考以下文章

WUST Online Judge - 1930: 热浪

WUST Online Judge - 2153: 旋转

WUST Online Judge - 2106: 熄灯问题

WUST Online Judge - 2147: 与时间赛跑

WUST Online Judge - 2161: 特殊的三角形

WUST Online Judge - 1188: 零起点学算法95——骨牌铺方格