算法设计与分析:第一张 算法分析介绍 1.3逻辑推理之谁能预测分数
2015-08-04 01:09
429 查看
/* 预测分数: 三维老师对某次学生竞赛进行了预测,他们预测如下: 甲说:学生A得第一名,学生B得第三名 乙说:学生C得第一名,学生D得第四名 丙说:学生D得第二名,学生A得第三名 竞赛结果表明,它们各说对了一般,说错了一半,并且无名次并列。试编程输入:a,b,c,d各自的名次 自己分析: 假设:X=i表明X学生的名次为i 那么甲的陈述可以表示为:A==1,B==3 乙 :C==1,D==4 丙 :D==2,A==3 因为每个人均说对一半,这可以表示为,仍然是用逻辑值添加的方法 用a,b,c,d表示4名同学,用存储的值表示他们的名次,则a + b + c + d = 1 + 2 + 3 + 4 = 10 枚举法 输入: 输出: a:4 b:3 c:1 d:2 */ /* 关键: 1 对于非数值化的题目,转化为数值化:1)用字母对应的值表示名次,得分等,2)采用逻辑与的加法操作解决:说话一半对,4个人中一个说谎等,3)采用枚举法 2 if( ((a == 1) + (b == 3) == 1) && ((c == 1) + (d == 4) == 1) && (((d == 2) + (a == 3) == 1 ) ) )//解析问题:每人说对一半 3 for(a = 1 ; a <= 4 ; a++) { for(b = 1 ; b <= 4 ; b++) { for(c = 1 ; c <= 4 ; c++) { if(a != b && b != c && c != a)//剪枝 { d = 10 - a - b - c; 4 那么甲的陈述可以表示为:A==1,B==3 乙 :C==1,D==4 丙 :D==2,A==3 因为每个人均说对一半,这可以表示为,仍然是用逻辑值添加的方法 用a,b,c,d表示4名同学,用存储的值表示他们的名次,则a + b + c + d = 1 + 2 + 3 + 4 = 10 枚举法 */ #include <stdio.h> bool check(int a,int b,int c,int d) { if( ((a == 1) + (b == 3) == 1) && ((c == 1) + (d == 4) == 1) && (((d == 2) + (a == 3) == 1 ) ) )//解析问题:每人说对一半 { return true; } else { return false; } } void process() { int a,b,c,d; for(a = 1 ; a <= 4 ; a++) { for(b = 1 ; b <= 4 ; b++) { for(c = 1 ; c <= 4 ; c++) { if(a != b && b != c && c != a)//剪枝 { d = 10 - a - b - c; if(check(a,b,c,d)) { printf("a:%d b:%d c:%d d:%d\n",a,b,c,d); break; } } } } } } int main(int argc,char* argv[]) { process(); getchar(); return 0; }
相关文章推荐
- HDU 4358 Boring counting dfs序+莫队算法
- 算法设计与分析:第一张 算法分析介绍 1.2逻辑推理之警察抓小偷
- 1163: [Baltic2008]Mafia
- c++编译链接
- 算法设计与分析: 第一章 算法分析介绍 1.1求任意三个已知数的最小公倍数
- 网站流量的统计中的IP、PV、UV
- Swift对象存储API概述
- 判断单链表是否有环
- Leetcode #90 Subsets II
- 编程之美:第四章 数字之趣 4.10_2数字哑谜和回文
- for循环 break
- 第一个Struts2应用
- Spring Boot 让 MyBatis 打印日志的方法
- 编程之美:第四章 数字之趣 4.11扫雷游戏的概率
- 父类析构函数写成虚函数防止隐蔽的内存泄露问题
- 编程之美:第四章 数字之趣 4.10数字哑谜和回文
- 编程之美:第四章 数字之趣 4.9数独知多少
- 编程之美:第四章 数字之趣 4.7蚂蚁爬杆
- 编程之美:第四章 数字之趣 4.8三角形测试用例
- 数论概论 第四章 高次幂之和与费马大定理 习题解答(宋二娃的BLOG)