【问题标题】:Algorithm Check for Switch Program切换程序的算法检查
【发布时间】:2015-09-12 17:16:00
【问题描述】:

我有 4 个在运行时随机生成的开关。例如:

开关1:1 0 0 0
开关2:0 1 0 0
开关 3:0 0 1 0
开关4:0 0 0 1

生成开关时,开关编号的列需要为1,但所有其他列随机分配(1或0)。

主开关对用户选择的开关执行异或运算。主开关从 0 0 0 0 开始。

当用户选择一个开关 ( s1,s2,s3,s4 ) 时,它会与当前主开关“异或”。

真实案例:
S1:1 1 0 0
S2:0 1 1 0
S3:0 0 1 0
S4:1 0 0 1
开始:0 0 0 0
与 S1:1 1 0 0
与 S3:1 1 1 0

目标是让主开关切换到 1 1 1 1。

在运行时创建四个开关时,我需要确保谜题是可解决的。关于如何比较四个开关以确定是否有组合可以实现 1 1 1 1 的获胜结果的任何建议。

更新------------ 注意:
0 和 0 = 0
1 和 1 = 0
0 和 1 = 1

【问题讨论】:

  • 运算是OR,不是AND

标签: algorithm math binary logic brute-force


【解决方案1】:

主开关从 0 0 0 0 开始。

当用户选择一个开关 (s1,s2,s3,s4) 时,它会与当前的主开关进行“与”运算。

如果您以 0000 开头并且唯一可用的操作是 AND,那么您将无法得到除 0000 之外的任何内容:0 & 1 = 0,而不是 0 & 1 = 1

根据您的真实案例中的示例,您似乎正在执行 OR 操作。如果是这种情况,那么任何谜题都是可以解决的,因为

开关编号的列需要为1

如果您将每个开关与原始0000 主开关进行或运算,您将始终得到1111。根据其他随机分配的位,您可以在对所有四个开关进行 OR 运算之前获得它,但如果您将每个开关与原始主开关进行 OR 运算,则可以保证获得 1111

【讨论】:

  • 在某些情况下这是无法解决的,是的,它们是“或”运算,我已经更正了这个问题。
  • 那我一定是错过了什么。告诉我我的理解不正确的地方。您的主开关 (MS) 从 0000 开始。 (s1, s2, s3, s4) 分别从 (1xxx, x1xx, xx1x, xxx1) 开始,其中“x”表示未知,可以是 0 或 1,我认为我们不在乎。如果您与 s1 或 MS,您将获得 1xxx。如果你用 s2 或这个,你会得到 11xx。如果你用 s3 和 s4 或这个,你得到 1111。我错过了什么?
  • 你是完全正确的。我现在意识到为什么我对原始问题是 AND 或 OR 逻辑感到困惑。请查看更新@huck_cussler
  • 酷。这使这个谜题变得更加有趣。值得一提的是,该操作通常被称为 XOR,或“异或”,并且仅当其中一个操作数为真时才为真。换句话说,当 A 或 B 为真但不是两者都为真时,它为真。
【解决方案2】:

这可以很容易解决,假设您将开关表示为Integer

public boolean isSolvable(Switch[] switches){
    int[] tmp = new int[SWITCH.COUNT];

    //generate an integer with all 1s of all switches
    for(Switch sw : switches)
        for(int i = 0 ; i < tmp.length ; i++)
            tmp[i] |= sw.get(i);

    //check if all bits that are part of the switches are 1
    for(int i : tmp)
        if(i == 0)
            return false;//this bit is 0 -> can't be set to 1 by combining switches

    //all bits can be set to 1 by combining switches
    return true;
}

希望这个 java 代码有所帮助。如果需要,我可以进一步解释。尽管 switch i 将列 i 设置为 1 的约束确保存在解决方案,但前提是交换机的数量至少等于每个交换机中的列数。

【讨论】:

  • 源代码是Java。开关是一个类的实例,每个位置有 4 个整数属性。 (1到4)。您能否针对这种情况修改您的答案?非常感激!! @保罗
猜你喜欢
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 2016-12-18
  • 1970-01-01
相关资源
最近更新 更多