当前课程知识点:程序设计基础 > 第三章 逻辑推理与枚举解题 > 3.5 谁是嫌疑犯——破案线索表示 > 3.5.1 谁是嫌疑犯——破案线索表示
下面呢我们来看
怎么来计算我们的破案的线索
那比如说我想表达A参与作案
那该怎么弄呢
刚才我们说了
我们用0表示没作案
用1表示作案
那么A参与作案呢
我们是这么写的
我们写成了A==1
那么A没参与作案呢
那当然可以写成A==0
或者A≠1
这个实际上是我们在
上一个题中已经学过了
同样的B参与作案呢
可以写成B==1
那如果A和B都参与作案呢
也就是说我们需要写成说
A==1并且B==1
我们需要表示并且这个意义
在这里的自然语的并且
就表示说两个情况呢同时成立
在逻辑推理中呢
我们会有一个专有的名词
称为“与”来表示这种关系
在计算机程序中呢
我们也有专有的
运算符来表示
那大家请看
对于两个命题来说
P和Q
如果他们同时成立
这种“与”的关系呢
我们在计算机中
用两个AND的符号来表示
这两个AND符号
其实他们连在一起是
一个运算符
而且我们把这个运算符称为
逻辑运算符
初学者特别要注意
有的时候就很容易
就忘了
就写了一个
这时候会有其他的意义
我们后面还会讲到
那在这里呢
我们为了表达
这种“与”的关系呢
我们就要用逻辑运算符
两个“与”的符号
那么这个运算符计算器怎么计算的呢
其实和我们的这个逻辑计算
我们数学中的逻辑计算是一样的
大家可以看这的
我们可以称为叫真值表
就是只有当P和Q
都是true的时候
这个“与”的结果才是true
其他情况下都是false
那当然我们跟逻辑计算的类似
我们还有别的逻辑运算符
“或”和“非”
那么“或”呢
在我们的代码中呢
写成两个竖线
那么我们也知道对于
“或”这个运算来讲、
P和Q只要有一个为true呢
结果就是true
而“非”呢在我们代码里头
用一个叹号来表示
这个叹号呢写在我们这个计算的这个命题的前边
当这个P的值是false的时候呢
那这个取“非”呢
结果是true
反过来如果这个P的取值是true呢
那取“非”以后呢结果就是false
下面呢我们来看具体的
这道题目中间提到的破案线索
那第一条就是说AB两人呢
至少有一个人作案
那我们理解成就是
或者是A做了案
或者是B做了案
所以我们写成我们的表达式呢
就是A==1或者B==1
第二条线索
AEF三人中至少有两人参与作案
大家请看这个表达式
稍微复杂一点
那至少有两人作案
那或者是A和E同时作案
或者是A和F同时作案
或者是E和F同时作案
所以呢主体来讲
是有3个东西依次的“或”
对每个来讲都是
两个人作案的情况
那对于第三个我们的破案线索
是说AD不可能是同案犯
那AD是同案犯怎么表示呢
A==1并且D==1
现在呢不可能所以呢我们在
这个表达式呢
整体的取一个“非”
下面一个线索是
BC或者同时作案
或者与本案无关
都不参与作案
所以也是两项
第一项是B和C都作案了
第二项呢是B和C都没做案
也就是第一项是说
B和C都等于1
第二项呢是B和C都等于0
下一个条件是说
CD中有且仅有1人作案
那意思就是C作案了
并且D没有作案
或者是说C没作案
但是呢D作案了
写成我们的式子是这样的
最后一个条件
如果D没有参与作案
那么E也不可能参与作案
这个确实是复杂一点
我们仔细的来看一看
如果D没有参与作案
那么E怎么怎么样
实际上呢是两种情况
D作案了的话呢怎么样
那我们自然语言来讲
现在是一个方面
我们先可以研究这个
D没有参与作案那是D=0
那这个时候呢
E也不可能参与作案
所以这时候E也=0
所以我们先可以写下说
D==0并且E==0
那么这是
这个语句的一个表面的意思
那这个语句自然语言的
另外一层意思是说
如果D参与作案了
那不知道没有说E怎么样情况
或者说甚至ABC这几个人怎么样没有说
那所以这个情况就是说D 如果
作案了那就D==1
其他不知道
所以对于这样一个
自然语言表示如果的条件呢
我们写成是这么两项
第一项复杂的是说
D和E都没有作案=0
第二项是说D作案了
那这个是从自然语言
到我们逻辑表达
到我们自然这个计算机程序的
这样一种转换
这就是我们对所有的
这个破案线索的
计算机的一个表达
把这些破案线索
和我们前面的枚举
组织在一起
那大家就可以看到我们的程序
是这个样子的
先定义
ABCDEF这几个变量
分别表示每个人的
是不是作案的这样一个情况
然后我们用多重的这么一个循环
来枚举所有可能的作案情况
然后对于所有破案线索
我们依次进行计算说
是不是符合这个破案线索
所描述的情况
那最后呢我们用这个if
如果符合所有的
这些破案线索
那我们就可以输出答案了
那么如果我在
枚举过程中间已经找到答案了
那我当然不希望在继续
枚举其他的可能了
那这个时候呢
我们就需要从这个循环中间退出
在上一个问题我们用了break的语句
在这我们也用break行不行呢
这个问题跟上一次不太一样
我们用了一个多重的循环
所以在这只用简单的一个break
用这么一个break呢
是不行的
那么这个break以后会怎么样呢
实际上他只会退出一层循环
请同学们呢自己在课后想办法
把我们代码稍微改一改
去验证下这个结论
大家请看
希望你呢自己验证一下
说我们break实际上只退到了
上一个for的那里
但是现在我们希望说
这样一个break能够退出到
这个所有的枚举的这么多for的外面去
我们解决方法呢就是利用
for语句中间的表达式2来实现的
那我们这儿的可以说是一个小的技巧
我们设置一个变量
我们也称为叫一个标志
这个标志呢来表示说
我们是不是已经找到了答案了
那我们只要在表达式2中
来检测这个变量
就只有在我们没找到答案的时候
我们才继续的去枚举
请看
我们定义了一个标志的一个变量
叫found
当然一开始枚举之前呢
我们没找到答案
所以它是false
如果我们找到答案了
大家看我们输出答案之后呢
我们就可以设置这个标志说
我已经找到答案了
found=true
在所有的for表达式2中间
我们都会加一个条件
我们“与”一个not found
只有在没有找到答案的时候我们才枚举
这样就能实现说
我们一找到答案
就退出了所有的for了
-1.1 基础知识
-1.2 买菜问题
-1.3 数学运算
-1.4 补充说明
-1.5 总结
--1.5 总结
-程设论道
--程设论道
-师生问答
-第一章 编程初步--语法自测
-2.1 关于超级计算器的几点思考
-2.2 电子秤模拟 — 背景介绍及需求分析
-2.3 电子秤模拟 — 代码实现
-2.4 变量定义与变量类型
-2.5 猜数游戏与数据表示
-2.6 关于变量的讨论
--公告
-2.7 变量体现的计算思维
-程设论道
--程设论道
-师生问答
--师生问答
-第二章 变量与代数思维--语法自测
-3.1 谁做的好事——语义表示
-3.2 谁做的好事——真假检查
-3.3 谁做的好事——循环枚举
-3.4 谁是嫌疑犯——多重循环枚举
-3.5 谁是嫌疑犯——破案线索表示
-3.6 谁是嫌疑犯——用二进制枚举
-程设论道
--程设论道一
--程设论道二
--程设论道三
-师生问答
-第三章 逻辑推理与枚举解题--语法自测
-4.1 插花游戏
-4.2 筛法
-4.3 线性查找
-4.4 折半查找
--4.4.1 提问
-4.5 排序问题
-4.6 总结
--4.6.1 总结
-程设论道
--程设论道二:筛法
-师生问答
-第四章 筛法与查找--语法自测
-5.1 阶乘
-5.2 排序
-5.3 矩阵填充
-5.4 分书与八皇后
-5.5 青蛙过河
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答一
--师生问答二
-第五章 分治思想与递归--语法自测
-6.1 兔子数列问题
-6.2 分鱼问题
-6.3 橱窗的插花问题
-6.4 最长公共子序列问题
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第六章 递推与动态规划--语法自测
-7.1 统计记录总数
-7.2 统计活跃用户数
-7.3 统计在线时长
--7.3.2 结构
-7.4 总结
--7.4.1 总结
-程设论道
--程设论道
-师生问答
--师生问答
-第七章 文本数据处理--语法自测
-8.1 将数据组织成链表
-8.2 提高链表访问效率 —— 哈希链表
-8.3 以二进制文件存储链表
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第八章 非文本数据处理--语法自测
-9.1 自动售卖程序
-9.2 配制水果信息
-9.3 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测