用程序去判断每个人说话的真假 - 写给新手的枚举介绍

这篇博客介绍了如何运用枚举算法解决判断每个人说话真假的问题。通过建立说话内容的逻辑模型,枚举所有可能的排名情况,并根据条件进行筛选,找到合法解。文章提供了具体的算法思路和代码实现,帮助新手理解枚举解空间和筛选过程。
摘要由CSDN通过智能技术生成

背景

我们在以前的数学题中一定遇到过这样的问题:

A说xxxx
B说xxx
C说xxx

然后给一些条件,让你判断每个人说话的真假

这个题目是这样的:

计算机学院准备组织院篮球赛,某班有ABCDE五个同学商量组队参加,他们在讨论谁来打前锋的时候发生了争执,于是他们请了另一个班的同学J当评委,五个人PK百米速度,谁的速度最快就由谁来当前锋,其实五个同学速度相当,比赛结束时,J让他们猜猜排名情况

  • A说:“E一定是第一名”
  • B说:“我可能是第二名”
  • C说:“A最慢”
  • D说:“C不是最快的”
  • E说:“D应该是第一名”

J最后说:“E肯定不是第二名或者第三名,你们几个只有获得第一名和第二名的人猜对了,你们应该知道谁最快了吧?”
编程给出五个同学的排名。

算法

习惯了通过表达式去计算一个结果的人,很难去用枚举的思维方式来处理问题。尤其对于枚举的模型很难把握。

枚举算法求解这类问题其实很简单,我尝试用以下三句话来说明:

  • 把每个人说的话用一个逻辑表达式表示出来
  • 枚举解空间内所有可能出现的情况
  • 按照题中条件,筛选合法解

建立说话内容(断言)的模型

可以很容易想到,上述问题中A的内容“E是第一名”可以写成:

Score['E'] == 1;

关键在于,如何描述“A说”的这个过程。很容易想到,这个过程实际上是一个从字符到表达式的映射。表达式在C语言中如何作为一个变量来使用?当然是函数指针,于是可以写出下面的代码:

int guessA(){
    return Score['E'] == 1;
}
int guessB(){
    return Score['B'] == 2;
}
...
int (*guess[256])();    //  定义一个函数指针的数组
guess['A'] = guessA;
guess['B'] = guessB;
...

这样的话,就可以用guess['A']()来表示A猜得正确与否

枚举解空间

这个题目较为简单,5个人的排名当然有5!种情况,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值