zoukankan      html  css  js  c++  java
  • WUST Online Judge

    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;
    }
    
    作者:McR
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Factorial Trailing Zeroes
    Convert Integer A to Integer B
    函数防抖、函数节流
    localstorage sessionstorage和cookie的区别
    element中表格中的表头与表格内容边框错位的解决方法
    解决Minio生成图片文件的分享链接无法正常下载的问题
    gin编写后端API的使用技巧
    YOLOV5源码解读-export.py网络结构、配置文件
    《三、YOLOV3细节原理全解析》
    《二、YOLOV2细节原理全解析》
  • 原文地址:https://www.cnblogs.com/mcr-tcp/p/9170629.html
Copyright © 2011-2022 走看看