user-0 提问: ACM 病狗问题 有兴趣的朋友看下

回复:
user: user-1
content: 引用 10 楼 lm_whales 的回复:[quote=引用 9 楼 FancyMouse 的回复:] [quote=引用 8 楼 lm_whales 的回复:]  不过，还是感觉，第一天就可以判断出，自己家的狗是否病狗。  因为如果看到所有的狗，那么只能看出 n-1 只是否病狗 ，自己的看不出来， 那么假设自己家的，不是病狗则可以看到 K 只病狗。 否则，假设自己家的是病狗，看到 K-1 只病狗。 那么自家的一定是病狗，因为只有自家的看不错来。  所以这里面应该还有条件，比如每次最多，只能看 n-k只狗。 你是不知道别人家看到了几只病狗的。所以你看到一个值，你不知道它是k-1还是k。[/quote] ++ 那就是还有一个条件，K是不知道的，只知道至少有一只病狗，只是第K天有人杀狗，大家都知道几只了 是这样么。 谢谢。 [/quote] k要是知道了这题还有啥出的价值？  >只是第K天有人杀狗，大家都知道几只了 这个不是条件。这个是你知道其他村民都足够聪明的时候他们能推导出的策略。

user: user-2
content: 两个，不太容易看出来的，隐含条件  1）村民，不知道,有几条狗是病狗，只知道有病狗（1～n 只病狗） 2）村民，每天判断一轮。  其他隐含条件  3) n>= 病狗数 >=1 4) n>= k >=  1 如果给出村民户数的话，需要判断 K是否是合法的数据， 最好 n 也要判断一下，这样才能保证，程序的健壮性（鲁棒性）robustness  即使直接输出 也需要判断n,k 是否符合以下条件 a）n>= 1               至少有1户村民，养了一只狗  b) n >= K && K>= 1     杀狗的天数 = 病狗数量 = 被杀的狗的数量= K =1～n

user: user-2
content: 谢谢 FancyMouse  终于理解了： K只病狗，是每个户村民不知道的，只是第K天有人杀狗，大家都知道是K只了 这样： 其中一条推论是， 每户村民，要么看到K 只病狗，要么看到K-1 只病狗  家有病狗和没有病狗的在K-1 轮的时候，都不会杀狗  因为看到K只病狗的，可以判断出要么K+1只病狗，要么K只病狗 如果是 K 只的话，自家的不是病狗，不用杀狗 如果是 K+1只，自家的是病狗，才会在第K+1天杀狗  而看到K-1 只的，看到K-1天，没有人杀狗，第K天，则会认定自家的狗是病狗 逻辑和看到K只的相同。 ================================  谢谢 FancyMouse

user: user-2
content: 引用 9 楼 FancyMouse 的回复:[quote=引用 8 楼 lm_whales 的回复:]  不过，还是感觉，第一天就可以判断出，自己家的狗是否病狗。  因为如果看到所有的狗，那么只能看出 n-1 只是否病狗 ，自己的看不出来， 那么假设自己家的，不是病狗则可以看到 K 只病狗。 否则，假设自己家的是病狗，看到 K-1 只病狗。 那么自家的一定是病狗，因为只有自家的看不错来。  所以这里面应该还有条件，比如每次最多，只能看 n-k只狗。 你是不知道别人家看到了几只病狗的。所以你看到一个值，你不知道它是k-1还是k。[/quote] ++ 那就是还有一个条件，K是不知道的，只知道至少有一只病狗，只是第K天有人杀狗，大家都知道几只了 是这样么。 谢谢。

user: user-2
content: 引用 13 楼 FancyMouse 的回复:[quote=引用 10 楼 lm_whales 的回复:]   [quote=引用 9 楼 FancyMouse 的回复:] [quote=引用 8 楼 lm_whales 的回复:]  不过，还是感觉，第一天就可以判断出，自己家的狗是否病狗。  因为如果看到所有的狗，那么只能看出 n-1 只是否病狗 ，自己的看不出来， 那么假设自己家的，不是病狗则可以看到 K 只病狗。 否则，假设自己家的是病狗，看到 K-1 只病狗。 那么自家的一定是病狗，因为只有自家的看不错来。  所以这里面应该还有条件，比如每次最多，只能看 n-k只狗。 你是不知道别人家看到了几只病狗的。所以你看到一个值，你不知道它是k-1还是k。[/quote] ++ 那就是还有一个条件，K是不知道的，只知道至少有一只病狗，只是第K天有人杀狗，大家都知道几只了 是这样么。 谢谢。 [/quote] k要是知道了这题还有啥出的价值？  >只是第K天有人杀狗，大家都知道几只了 这个不是条件。这个是你知道其他村民都足够聪明的时候他们能推导出的策略。[/quote] 知道了  嗯，因为，这个几乎是理所当然的原因，所以题目里，没有作为条件列出 但是推理的时候，要用到他，所以他也是隐含的条件。

user: user-1
content: 引用 8 楼 lm_whales 的回复:不过，还是感觉，第一天就可以判断出，自己家的狗是否病狗。  因为如果看到所有的狗，那么只能看出 n-1 只是否病狗 ，自己的看不出来， 那么假设自己家的，不是病狗则可以看到 K 只病狗。 否则，假设自己家的是病狗，看到 K-1 只病狗。 那么自家的一定是病狗，因为只有自家的看不错来。  所以这里面应该还有条件，比如每次最多，只能看 n-k只狗。 你是不知道别人家看到了几只病狗的。所以你看到一个值，你不知道它是k-1还是k。

user: user-1
content: 引用 3 楼 lm_whales 的回复:这是应该用prolog 语言，这样才能够让程序去推理。 用C++，直接实现一个，推理系统有点难度。 没有推理过程，这个程序也没有用处，虽然可能是正确的。 求个prolog代码。我看了半天也没想出来怎么用prolog写这玩意

user: user-2
content: 这是应该用prolog 语言，这样才能够让程序去推理。 用C++，直接实现一个，推理系统有点难度。 没有推理过程，这个程序也没有用处，虽然可能是正确的。

user: user-2
content: 不过，还是感觉，第一天就可以判断出，自己家的狗是否病狗。  因为如果看到所有的狗，那么只能看出 n-1 只是否病狗 ，自己的看不出来， 那么假设自己家的，不是病狗则可以看到 K 只病狗。 否则，假设自己家的是病狗，看到 K-1 只病狗。 那么自家的一定是病狗，因为只有自家的看不错来。  所以这里面应该还有条件，比如每次最多，只能看 n-k只狗。

user: user-2
content: 看懂一点： 这里有个隐含条件，没有给出。 1）即村民全体，每天做一次判断，不多也不少。 其他逻辑是 2）每家村民一只狗 3）狗狗有两种状态，       3.1）病了，3.2）没病 4）村民对自己的狗，可以采取两种措施        4.1）杀，4.2）不杀， 5）村民一天只做一次判断，并杀掉自家的病狗。  6）村民在同一天杀狗的讯息，不会传到其他村民家中，只有第二天才会知道，         6.1） 上一轮没人杀狗，再次开始判断         6.2） 上一轮有人杀狗，结束判断。  7）村民杀自家的狗的前提是，判断出来自家的狗是病狗。      //伪代码：         //if(dog[peson] == illdog)killdog(dog[person]); 8）村民不能直接判断自家的狗，是否病狗 9）村民可以观察到，别家的村民的家的狗，是否病狗和别家的病狗个数，   从而判断出自家的狗，是病狗，和不确定是病狗的信息。 10）每户村民，可以观察到的病狗数目是        9.1）自己的狗没病结果,是病狗总数        9.2) 自己的狗是病结果,是病狗总数-1 11）村民判断出自家的狗，是病狗的条件是，病狗数比自己观察到的病狗数多1只 12）村民，可以根据上一轮，还没有杀狗的天数。    判断出病狗，是否比观察到的病狗数多一只，从而断定自己家的是病狗。    12.1） 看到所有病狗的村民，不需要在判断了，因为自己家的狗，不是病狗    12.2） 少看到一只病狗的村民，只能根据自己看到的狗数，和判断持续的轮数           判断自己家的狗是否病狗。       13）当有病狗的时候，病狗数>=1 就是#1楼的第一条.并且一定有病狗。 14) 所有村民，的逻辑都没有错误。（每户村民都是极其聪明的） 15）第K天家有病狗的村民(都同时),判断出自己家的狗是病狗，并杀掉.   16）杀狗的天数和病狗的数量相同。（结论1） 17）到杀狗那天结束为止，村里没有病狗了，因为病狗都杀了（结论2，此时判断过程结束） 18）病狗的数量 =K （结论3，最终结论）   这是我对这个题目的总结，可能有些结论是无用的

user: user-2
content: 引用 5 楼 FancyMouse 的回复:[quote=引用 3 楼 lm_whales 的回复:] 这是应该用prolog 语言，这样才能够让程序去推理。 用C++，直接实现一个，推理系统有点难度。 没有推理过程，这个程序也没有用处，虽然可能是正确的。 求个prolog代码。我看了半天也没想出来怎么用prolog写这玩意[/quote] 很遗憾，prolog 看过，不会用，另外对那个分析，我也是没怎么看懂

user: user-3
content: 这是一道逻辑题，通过逻辑推演可以证明，第几天响起枪声，就有几条病狗 代码本身的功能是输入k然后输出k，代码不能用来证明什么，只是你证明之后才能写出代码