[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

不限语言解决“谁做了糗事儿”问题

本帖最后由 老刘1号 于 2020-2-26 21:04 编辑
4人中有1人做了糗事儿,已知有3人说了真话、1人说了谎话。
a说:不是我;
b说:是c;
c说:是d;
d说:c瞎说。
请判断是谁做了糗事儿?

附一个C,无脑排除法:https://tool.lu/coderunner/embed/7Xm.html

回复 4# red2020


    简洁、优雅的代码, 学习了
用按位与运算巧妙的进行了类似排除法的操作
已经被排除的人(0)不会被再次被认定(0&1=0)。

lz才疏学浅,还有一个小疑惑:
我的算法中,遇到将已经排除的”做糗事的人“认定为“做糗事的人”时,会认定为矛盾直接返回
但这个算法中似乎并没有类似的举措,只要最终有人未被排除,就直接认定为该人
这样在遇到其它类似问题时,是否可能会出现因为未返回产生的增根?

TOP

回复 2# xczxczxcz


    看不懂.jpg

TOP

一万年之后学了离散数学的我又回来了,5楼标准答案,

附一个列真值表求解的:
  1. @echo off
  2. for /l %%i in (0 1 0xf) do (
  3. set /a "a=%%i&1,b=(%%i>>1)&1,c=(%%i>>2)&1,d=(%%i>>3)&1"
  4. set /a "result=((a & !b & !c & !d) | (!a & b & !c & !d) | (!a & !b & c & !d) | (!a & !b & !c & d)) & ((! !a & c & d & !d) | (!a & !c & d & !d) | (!a & c & !d & !d) | (!a & c & d & ! !d))"
  5. call echo [%%a%% %%b%% %%c%% %%d%%] - %%result%%
  6. )
  7. pause
复制代码

TOP

回复 10# cmd1152


    d说c是假不代表d说是c哦

TOP

返回列表