﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-gujiayue-随笔分类-离散数学及其应用</title><link>http://www.cppblog.com/gujiayue/category/20001.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 05 Jul 2014 05:55:38 GMT</lastBuildDate><pubDate>Sat, 05 Jul 2014 05:55:38 GMT</pubDate><ttl>60</ttl><item><title>最近很火的50只狗，有好狗有病狗，去判断有几只病狗的的逻辑推理题目</title><link>http://www.cppblog.com/gujiayue/archive/2014/07/02/207489.html</link><dc:creator>古月</dc:creator><author>古月</author><pubDate>Wed, 02 Jul 2014 08:06:00 GMT</pubDate><guid>http://www.cppblog.com/gujiayue/archive/2014/07/02/207489.html</guid><wfw:comment>http://www.cppblog.com/gujiayue/comments/207489.html</wfw:comment><comments>http://www.cppblog.com/gujiayue/archive/2014/07/02/207489.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/gujiayue/comments/commentRss/207489.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gujiayue/services/trackbacks/207489.html</trackback:ping><description><![CDATA[<p><span style="font-family:宋体;">题目：</span><span style="font-family: 宋体; font-size: 16px; line-height: 26px; background-color: #ffffff;">50人有50条狗，有病狗。每个人只能看到其他人的狗（不能看到自己的狗），只有狗的主人才能打死狗。相互不能交流，不能通知狗的主人。如果推断出自家狗是病狗，就要枪毙，只能枪毙自家狗。第一天没有枪声，第二天有一阵枪声。请问有几只病狗？</span><br /><span style="font-family:宋体;"><br />听说这是小升初的考试题，这实在是太难了，怀疑那些出题的老师第一次看到这个题能不能做出来。这应该是离散数学中典型的逻辑分析题，我想除了专门修过离散数学和少数天才外应该很少有人在规定时间内算出答案，反正我算不出。下面的分析过程，是我参考了网上的答案，再按照自己的理解写出来的。<br /><br /><br />其实我认为这个题之所以难，我觉得是题目表达的不够清晰。理解这个问题首先有几个隐含的条件要搞明白。<br /></span><span style="color: red;"><strong>a</strong></span><span style="font-family:宋体;">、</span>50<span style="font-family:宋体;">只狗里面至少有</span>1<span style="font-family:宋体;">只病狗。<br /></span><span style="color: red;"><strong>b</strong></span><span style="font-family:宋体;">、病狗是一眼就能分辨出来的，但是狗的主人无法观察判断自己的狗是不是病狗。<br /></span><span style="color: red;"><strong>c</strong></span><span style="font-family:宋体;">、狗的主人推断出自己的狗是病狗后，一定要在当天杀死狗，在当天中的</span>0:00<span style="font-family:宋体;">到</span>24:00<span style="font-family:宋体;">任何时候都行。</span></p>  <p><span style="font-family:宋体;">从而还能得到一个<strong><span style="color:red">推论</span></strong></span><strong><span style="color:red">d</span></strong><span style="font-family:宋体;">：如果病狗的主人看到</span>N<span style="font-family:宋体;">只病狗，那么好狗的主人能看到</span>N+1<span style="font-family:宋体;">只病狗，也就是说病狗的主人看到的病狗的数量是实际病狗数量再减</span>1.</p>  <p><br />明确了上述的3个条件和1个结论，再去解答这个问题，就会简单很多。&nbsp;</p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">1，&nbsp;<span style="font-family:宋体;">假设只有</span>1<span style="font-family:宋体;">只病狗，所有人在观察完其他人的狗后，那么根据推论</span>d<span style="font-family:宋体;">，病狗的主人不会看到病狗，再根据条件</span>a<span style="font-family:宋体;">，从而能够推断出自己的狗是病狗，于是会在当天</span>24<span style="font-family:宋体;">点之前杀死自己的狗。</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">2，&nbsp;<span style="font-family:宋体;">但是第一天没有枪声，说明至少有</span>2<span style="font-family:宋体;">只病狗（把这个结果当成<strong><span style="color:red">推论</span></strong></span><strong><span style="color:red">e</span></strong><span style="font-family:宋体;">）。于是从第二天</span>0:00<span style="font-family:宋体;">开始，所有人都应该知道至少有两只病狗。假设只有</span>2<span style="font-family:宋体;">只病狗，根据推论</span>d<span style="font-family:宋体;">，病狗的主人只看到</span>1<span style="font-family:宋体;">只病狗，说明剩下的那只没有看到的病狗就是自己的狗，于是在第二天可以从</span>0:00<span style="font-family:宋体;">到</span>24:00<span style="font-family:宋体;">选择任何一个时间点杀死自己的狗，第二天就会听到枪声。</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">3，&nbsp;<span style="font-family:宋体;">继续假设有</span>3<span style="font-family:宋体;">只病狗的话。由根据推论</span>d<span style="font-family:宋体;">，病狗的主人能观察到</span>2<span style="font-family:宋体;">只病狗，再根据推论</span>e<span style="font-family:宋体;">，所以无法判断自己的狗是否为病狗，所以在第二天不可能杀狗，也就不会有枪声，综合</span>1<span style="font-family:宋体;">和</span>2<span style="font-family:宋体;">，答案为</span>2<span style="font-family:宋体;">只狗。</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">4，&nbsp;<span style="font-family:宋体;">把题目改一下，改成是第三天听到枪声。第二天</span>0:00<span style="font-family:宋体;">一到，大家都知道有</span>2<span style="font-family:宋体;">只病狗了，那么第二天一直到</span>24:00<span style="font-family:宋体;">都没有枪声的话，说明每个人都看到至少</span>2<span style="font-family:宋体;">只病狗。根据推论</span>d<span style="font-family:宋体;">，那么从第三天</span>0:00<span style="font-family:宋体;">开始，每个人会知道至少有</span>3<span style="font-family:宋体;">只病狗。假设也只有</span>3<span style="font-family:宋体;">只病狗，那么病狗的主人只能看到</span>2<span style="font-family:宋体;">只病狗，说明剩下的那只没有看到的病狗就是自己的狗，于是在第三天肯定要杀死自己的狗，第三天就会有枪声。</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">5，&nbsp;<span style="font-family:宋体;">以此类推，第几天听到枪声，就有几只狗。</span></p><img src ="http://www.cppblog.com/gujiayue/aggbug/207489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gujiayue/" target="_blank">古月</a> 2014-07-02 16:06 <a href="http://www.cppblog.com/gujiayue/archive/2014/07/02/207489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用数学来推导趣味逻辑题：骑士与流氓问题。</title><link>http://www.cppblog.com/gujiayue/archive/2012/09/26/192119.html</link><dc:creator>古月</dc:creator><author>古月</author><pubDate>Wed, 26 Sep 2012 10:06:00 GMT</pubDate><guid>http://www.cppblog.com/gujiayue/archive/2012/09/26/192119.html</guid><wfw:comment>http://www.cppblog.com/gujiayue/comments/192119.html</wfw:comment><comments>http://www.cppblog.com/gujiayue/archive/2012/09/26/192119.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/gujiayue/comments/commentRss/192119.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gujiayue/services/trackbacks/192119.html</trackback:ping><description><![CDATA[对于类似骑士与流氓的这种逻辑思维题，除了极个别的天才能够大脑随便一想就知道答案，绝大多数人都要好好的推断一会。<br />而<span style="color: red; ">离散数学就教给了我们一种用数学方法来推导这种逻辑题，使得这些问题的难度降低不少。</span><br />下面就来看下《离散数学及其应用》第六版，1.1章练习题第55题我的推导分析吧。<br /><br />一个小岛上住着两类人，一类是骑士，一类是流氓，骑士只说真话，流氓只说假话，有AB两个人，根据他们所说的话，判断AB各自是流氓还是骑士。<br />a)A说：我们之间至少有一个是流氓。B什么都没有说<br />b)A说：我们两个都是骑士。B说：A是流氓。<br />c）A说：我是流氓或者B是骑士。B什么都没说<br />d）两个人都说：我是骑士<br />e）A说：我们都是流氓。B什么都没说。<br /><br />个人分析：<br /><strong style="color: red; ">首先，定义命题p为A是骑士，!p代表A是流氓，q为B是骑士，!q为B是流氓</strong><br />a）A说的内容可以用如下数学符号表达：（!p &#8744; !q）。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;假设A是骑士，即p=1，说明A说的内容为真，即(!p &#8744; !q)=1，因为p=1推出!p=0，所以!q=1，所有q=0，即B为流氓。过程没有矛盾。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;保险起见，再假设A是流氓，即!p=1，说明A说的内容为假，即(!p &#8744; !q)=0，但是!p=1，所以(!p &#8744; !q)不可能为0，所以有矛盾。<br />&nbsp; &nbsp; &nbsp; 结果就是A是骑士，B为流氓<br />b）A说的内容：(p &#8743; q)，B说的内容：!p<br />&nbsp; &nbsp; &nbsp; 假设A是骑士，即p=1，说明A说的内容为真，即(p &#8743; q)=1，推出q=1，说明B也为骑士，那B说的话为真，就是说!p=1，即A为流氓，结论与条件矛盾，假设不对<br />&nbsp; &nbsp; &nbsp; 假设A是流氓，即!p=1，说明A说的内容为假，即(p &#8743; q)=0，此时q是0还是1，都符合。再从B说的话着手，因为!p=1，所以B说的话是正确的，所以q=1，B是骑士，没有矛盾。<br />&nbsp; &nbsp; &nbsp; 结果就是A是流氓，B是骑士<br />c）A说的内容：(!p &#8744; q)<br />&nbsp; &nbsp; &nbsp; 假设A是骑士，即p=1，说明A说的内容为真，即(!p &#8744; q)=1，推出q=1，即说明B也为骑士，没有矛盾。<br />&nbsp; &nbsp; &nbsp; 假设A不是骑士，即!p=1，说明A说的内容为假，即(!p &#8744; q)=0，但是!p=1，所以无论(!p &#8744; q)是不可能为0的，所以矛盾<br />&nbsp; &nbsp; &nbsp; 结果俩人都是骑士<br />d）A说的内容：p。B说的内容：q<br />&nbsp; &nbsp; &nbsp; 假设A是骑士，即p=1，说明A说的内容为真，即p=1，与条件相符。<br />&nbsp; &nbsp; &nbsp; 假设A是流氓，即!p=1，说明A说的内容为假，即p=0，此时也与条件相符。<br />&nbsp; &nbsp; &nbsp; B的判断也一样，所以结果是无法判断出谁是骑士谁是流氓<br />e）A说的内容：(!p &#8743; !q)<br />&nbsp; &nbsp; &nbsp; 假设A是骑士，即p=1，说明A说的内容为真，即(!p &#8743; !q)=1，因为!p=0，所以无论如何(!p &#8743; !q)是不可能为0的，矛盾<br />&nbsp; &nbsp; &nbsp; 假设A是流氓，即!p=1，说明A说都内容为假，即(!p &#8743; !q)=0，说明!q=0，即B是骑士，没有矛盾<br />&nbsp; &nbsp; &nbsp; 结果是A是流氓，B是骑士<img src ="http://www.cppblog.com/gujiayue/aggbug/192119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gujiayue/" target="_blank">古月</a> 2012-09-26 18:06 <a href="http://www.cppblog.com/gujiayue/archive/2012/09/26/192119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>逻辑推理：在一个100条语句的列表中，第n条语句是“在这个列表中，恰有n条语句为假”，可以得出什么结论？</title><link>http://www.cppblog.com/gujiayue/archive/2012/09/26/192084.html</link><dc:creator>古月</dc:creator><author>古月</author><pubDate>Wed, 26 Sep 2012 07:31:00 GMT</pubDate><guid>http://www.cppblog.com/gujiayue/archive/2012/09/26/192084.html</guid><wfw:comment>http://www.cppblog.com/gujiayue/comments/192084.html</wfw:comment><comments>http://www.cppblog.com/gujiayue/archive/2012/09/26/192084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gujiayue/comments/commentRss/192084.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gujiayue/services/trackbacks/192084.html</trackback:ping><description><![CDATA[<div>《离散数学及其应用》第六版1.1练习题第43题的个人分析<br /></div>题目：在一个100条语句的列表中，第n条语句是&#8220;在这个列表中，恰有n条语句为假&#8221;..........<br />&nbsp; &nbsp; &nbsp;a）从这些语句中得出什么结论<br />&nbsp; &nbsp; &nbsp;b) 若第n条语句是&#8221;至少有n条语句为家&#8220;，结论是什么<br />&nbsp; &nbsp; &nbsp;c）假设包含99条语句，回答b<br /><br />答案网上都有，我是给出自己的分析过程：（思路大概是：如果这句话话为真，推出这句话的内容为真，由这句话的内容又能推出其余话的是不是为真，再根据其余话的内容来判断是不是矛盾。<span style="color: red; ">主要就是看这句话为真与这句话的内容为真是不是矛盾。分清这句话和这句话的内容，就明了了）</span><br />a）p1，p2,.....p100分别代表这个100条语句。<br />假设p1为真，根据p1的内容，既然只有1个语句为假了，那后面的99条语句说的全不是只有1个为假，说明后面99条全为假。可既然后面99条全为假了，那说明这个列表有99条为假，但是p1说只有1个为假，条件和结论相矛盾。所以假设不成立，说明p1为假。<br />同样的方法推断p2。假设p2为真，根据p2内容，后面的98条全是假的了，再算上p1已经为假了，说明列表里有99条为假，与p2内容矛盾。所以假设不成立，说明p2也为假。<br />同样推断出p3到p98也都是假的。<br />再看p99，假设p99为真，首先前面98条已经证明为假的了，再根据p99的内容&#8221;恰有99条为假&#8220;，还差1条，说明p100肯定为假。而从p100的内容&#8221;恰有100条语句&#8220;来判断，p100也确实为假（因为p99为真的，所以p100的内容是不对的）。这个由条件到结果是不矛盾的。保险起见，再假设p99为假的，因为前面98个已经证明为假了，而p99也假设为假了，现在共有99条假的了，再根据p99的内容，说明p100也必须为假，因为如果p100为真的话，那p99就是真话了。如果p100也为假的话，那说明这个列表全部都为假了，可是这样又到底了p100的内容是真的，条件到结论矛盾。再次证明了p99为真<br />再看p100，现在已知98都为假，p99为真，p99既然为真，那他的内容就是一个事实&#8221;恰有99条为假&#8220;，还差1条，只能说明p100为假了，如果p100为假的话，那么p100所陈述的内容就是假的，而事实也确实说明p100的内容为假。<br /><span style="color: red; ">所以最后的结果是：除了p99，其余全为假。</span><br />b）这个要反过来推到<br />先假设p100为真，那p100的内容就是真的&#8221;至少有100条假&#8220;，因为总共就100条，说明全都为假，可既然100条都是假，那p100也是假的，又矛盾了。表明p100应该为假的。（也可以从另外一个角度证明，p100的内容&#8221;至少有100条假&#8220;是真的，说明&#8221;至少有99条、98条、1条为假&#8220;都是真的，前面99条都为真的，那怎么还能至少100条为假呢，矛盾。表明p100为假）<br />同样方法推断p99，假设p99为真，由p99的内容推断p1到p98都为真，而p1到p98都为真显然是与p99的内容不符合的，矛盾。表明p99为假。<br />同样推断出p98到p51都为假的。<br />再看p50，假设p50为真，由p50的内容推断p1到p49也都为真，说明50条为假的语句只能是p51到p100了，而事实上p51到p100也确实都为假，不矛盾。表明p50应该为真。保险期间，我们再假设p50为假，那说明p50的内容&#8221;至少50条语句为假&#8220;是不对的，可是p51到p100这50条语句已经证明为假了，矛盾。再次表明p50应该为真。<br />接着看p49，假设p49为真，由p49的内容推断p1到p48都为真，而p51到p100都为假，也论证了p49的内容是没错的，没有矛盾。p49为真<br />同理推断出p48到p1也都为真。<br /><span style="color: red; ">所以最后的结果是：p1到p50为真，其余为假。</span><br />c）同样方法推断出p99到p51为假<br />推断p50，假设p50为真，由其内容推断出p1到p49都为真，一共99条语句，p1到p49为真，p50也假设为真了，只剩下49条语句根本凑不成50条为假了，所以矛盾，p50为假。可是p50如果为假的，由于p51到p99这49条已经为假了，再加上p50又为假，说明这个列表确实至少有50个为假，这样说明p50的内容是对的，p50应该是真的，再次矛盾。可见无论p50为真还是为假，都矛盾。<span style="color: red; ">说明这是个悖论。</span><img src ="http://www.cppblog.com/gujiayue/aggbug/192084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gujiayue/" target="_blank">古月</a> 2012-09-26 15:31 <a href="http://www.cppblog.com/gujiayue/archive/2012/09/26/192084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>