1 Star 0 Fork 0

徒步天下 / 程序设计与算法二OJ题解

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
001:特殊密码锁.md 2.60 KB
一键复制 编辑 原始数据 按行查看 历史
徒步天下 提交于 2017-11-14 14:42 . 更新 001:特殊密码锁.md

001:特殊密码锁

总时间限制: 1000ms 内存限制: 1024kB

描述

有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。

然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。

当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。

输入

两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。

输出

至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。

样例输入

011
000

样例输出

1

全局题号

8469

题解

#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

void SetBit(int &c, int i, int v)
{
    if (v)
    {
        c |= (1<<i);
    }
    else
        c &= ~(1<<i);
}

/* 将开关转换为实际掩码
 */
int act2mask(int act, int n)
{
    int result = 0;
    for (int i=0; i<n; i++)
    {
        if (act&(1<<i))
        {
            result ^= (1<<i);
            if (i>0)
                result ^= (1<<(i-1));
            if (i<n-1)
                result ^= (1<<(i+1));
        }
    }
    return result;
}

/* change:
   返回按钮个数
   参数:
     from: 原锁
     to: 变化后的锁
     act: 最后两位
     n: 总位数

   注意:运算符的优先级
*/
int change(int from, int to, int act, int n)
{
    int count=0;
    if (((from^act2mask(act,n))&1) != (to&1))
        return -1;
    for (int i=1;i<n-1;i++)
    {
        SetBit(act, i+1, ((from^act2mask(act,n)^to)>>i)&1);
    }
    if ((from^act2mask(act,n))==to)
    {
        for (int i=0;i<n;i++)
            if (act&(1<<i))
                count++;
        return count;
    }
    else
        return -1;
}

int main()
{
    char a[32], b[32];
    int from=0, to=0, n;
    int found = 0;

    scanf("%s%s", a, b);
    n=strlen(a);
    for (int i=0;i<n;i++)
    {
        from = from * 2 + a[i]-'0';
        to = to * 2 + b[i]-'0';
    }

    for (int i=0;i<3; i++)
    {
        int count;
        if ((count=change(from, to, i, n))>=0)
        {
            printf("%d\n", count);
            found = 1;
            break;
        }
    }
    if (!found)
        printf("impossible\n");

    return 0;
}
C++
1
https://gitee.com/se17a/c02.git
git@gitee.com:se17a/c02.git
se17a
c02
程序设计与算法二OJ题解
master

搜索帮助