【问题标题】:Boolean system ( for C++/ C#/java)布尔系统(用于 C++/C#/java)
【发布时间】:2011-05-14 16:17:00
【问题描述】:

如何以编程方式解决这种类型的系统:

A = !B
B = !C
D = !B
E = !A
E = !B

所以我可以通过替换 A = C = D (3)E = B (2) 来获得。我只需要2组的数量。如果无法获得 2 个组,我会显示一条错误消息。

【问题讨论】:

  • 相关(我想说“重复”):How many lie and how many tell the truth?
  • 我没有看到他的编辑,但我会更感激这个问题的答案。还没解决:)
  • 不是重复的。该问题要求给出的基本方法。这个问题比较具体,询问实现细节。
  • @IVlad:我仍然认为这是骗人的,因为也可以轻松实现对图形进行 2 着色的方法(请参阅我的答案)。
  • @Dan Dinu,顺便说一句,我想如果你不打算花太多时间在这个作业上,你可以使用 Jon Skeet 的蛮力方法。

标签: algorithm


【解决方案1】:

如果这不是作为骗子关闭的,请从我的answer 在您之前的问题中:

解方程组

X1 = 非 X 3

X5 = 非 X 2

形成一个图,节点为 Xi 并连接 Xi 和 X j iff 方程 Xi = NOT X j 出现。

现在尝试使用广度优先搜索对图表进行 2 色着色。

【讨论】:

  • 感谢您的回答。我有图表的想法,但我很快就放弃了。我仍然不认为我明白这一点。你是说为每个方程连接节点 Xi 和 Xj,但最后我得到一个连接图
  • @Dan:很高兴你得到一个连通图。你有什么问题?
  • 我不明白如果图表完全连接,我怎么能弄清楚这两组是什么。 (情况只有2组)
  • @Dan:你知道2色是什么意思吗?
  • 我上面例子中的图表如下: A 链接到 B; B 与 C 相连; B 与 D 相连,E 与 A 和 B 相连;如果我不明白你的意思,我必须给节点 2 种颜色,这样 adiacent 节点就不会具有相同的颜色。但是在这个例子中我怎么能做到这一点? A连接到B; B 到 E 和 E 到 A。如果 A 是黑色的,则 E 和 B 是白色的,但 E 和 B 是相邻的。我错了吗?
【解决方案2】:

考虑一串比特ABCDE。对于此字符串的每个subset,将该子集中的所有变量设置为true,将不在该子集中的所有变量设置为false。查看哪个子集符合您的条件。

您可以通过从02^(num variables) - 1 的二进制计数来实现这一点。对于每个数字,它的二进制表示为您提供了哪些变量是true,哪些是false。所以你只需要得到一个数字的所有位并进行检查。

【讨论】:

  • 虽然很容易实现,但这是一种所谓的蛮力解决方案,通常在学术界不受欢迎。
猜你喜欢
  • 2016-02-09
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 2010-10-08
相关资源
最近更新 更多