C语言经典枚举算法之谁在说谎(详解)

2023-10-19 10:50

本文主要是介绍C语言经典枚举算法之谁在说谎(详解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、枚举算法
    • 二、谁在说谎问题

一、枚举算法

1、枚举
枚举算法是我们在日常中使用到的最多的一个算法,它的核心思想就是:枚举所有的可能。
枚举法的本质就是从所有候选答案中去搜索正确的解。

2、使用枚举算法需要满足两个条件
(1)可预先确定候选答案的数量;(2)候选答案的范围在求解之前必须有一个确定的集合。

3、枚举的优点
枚举算法简单粗暴,他暴力的枚举所有可能,尽可能地尝试所有的方法。虽然枚举算法非常暴力,而且速度可能很慢,但确实我们最应该优先考虑的!因为枚举法变成实现最简单,并且得到的结果总是正确的。

4、枚举的缺点
运算量比较大,解题效率不高。如果枚举范围太大,在时间就难以承受。枚举算法的优点:思路简单,程序编写和调试方便。在竞赛中,时间有限的,我们竞赛的最终目标就是求出问题解。因此,如果题目的规模不是很大,在满足规定的时间和空间要求下能够求出解,那么我们最好是采用枚举法,而不需要大在意是否还有更快的算法,这样可以使你有更多的时间去解答其他难题。

二、谁在说谎问题

1、问题
张三说李四在说谎,李四说王五在说谎,王五说张三、李四都在说谎。

2、问题分析
这是一个逻辑推理题,用正常的推理无法得出答案。利用反证法,我们可以先假设一个条件,然后根据这个条件进行推理,如果得出的结果不与条件矛盾,则说明条件成立 ,如果推出的结果与已知条件矛盾说明条件是错误的。

3、C语言找出谁在说谎

#include <stdio.h>
void main()
{int a, b, c;for(a=0; a<=1; a++)for(b=0; b<=1; b++)for(c=0; c<=1; c++){if(a==0)  //如果张三没有说谎 {if(b==1)  //如果李四在说谎 if(c==0)  //如果王五没有说谎 if(a==1 && b==1)printf("%3d,%3d,%3d\n", a, b, c);}if(b==0)  //如果李四没说谎 {if(a==1 && c==1)  //如果张三和王五在说谎 if(a==0 || b==0)printf("%3d,%3d,%3d\n", a, b, c);}if(c==0)  //如果王五没有说谎 {if(a==1 && b==1)  //如果张三和李四在说谎 if(b==0)printf("%3d,%3d,%3d\n", a, b, c);}}
}

01

4、原理分析
从运行结果上看,张三和王五在说谎,李四没有说谎。
(1)首先依次枚举a、b、c的候选解,候选解只有两种取值0和1,0表示没有说谎,1表示说谎
(2)然后分别假设张三没说谎,并验证结果。
(3)假设李四没说谎,并验证结果。
(4)再假设王五没说谎,并验证结果 。

参考文献:《The Function and Algorithm of Program Language C/C++》

这篇关于C语言经典枚举算法之谁在说谎(详解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/239284

相关文章

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

Spring Integration Redis 使用示例详解

《SpringIntegrationRedis使用示例详解》本文给大家介绍SpringIntegrationRedis的配置与使用,涵盖依赖添加、Redis连接设置、分布式锁实现、消息通道配置及... 目录一、依赖配置1.1 Maven 依赖1.2 Gradle 依赖二、Redis 连接配置2.1 配置 R

Python WSGI HTTP服务器Gunicorn使用详解

《PythonWSGIHTTP服务器Gunicorn使用详解》Gunicorn是Python的WSGI服务器,用于部署Flask/Django应用,性能高且稳定,支持多Worker类型与配置,可处... 目录一、什么是 Gunicorn?二、为什么需要Gunicorn?三、安装Gunicorn四、基本使用启

C#中的Drawing 类案例详解

《C#中的Drawing类案例详解》文章解析WPF与WinForms的Drawing类差异,涵盖命名空间、继承链、常用类及应用场景,通过案例展示如何创建带阴影圆角矩形按钮,强调WPF的轻量、可动画特... 目录一、Drawing 是什么?二、典型用法三、案例:画一个“带阴影的圆角矩形按钮”四、WinForm

MySQL ORDER BY 语句常见用法、示例详解

《MySQLORDERBY语句常见用法、示例详解》ORDERBY是结构化查询语言(SQL)中的关键字,隶属于SELECT语句的子句结构,用于对查询结果集按指定列进行排序,本文给大家介绍MySQL... 目录mysql ORDER BY 语句详细说明1.基本语法2.排序方向详解3.多列排序4.常见用法示例5.

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

C#之枚举类型与随机数详解

《C#之枚举类型与随机数详解》文章讲解了枚举类型的定义与使用方法,包括在main外部声明枚举,用于表示游戏状态和周几状态,枚举值默认从0开始递增,也可手动设置初始值以生成随机数... 目录枚举类型1.定义枚举类型(main外)2.使用生成随机数总结枚举类型1.定义枚举类型(main外)enum 类型名字

DNS查询的利器! linux的dig命令基本用法详解

《DNS查询的利器!linux的dig命令基本用法详解》dig命令可以查询各种类型DNS记录信息,下面我们将通过实际示例和dig命令常用参数来详细说明如何使用dig实用程序... dig(Domain Information Groper)是一款功能强大的 linux 命令行实用程序,通过查询名称服务器并输

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)