小解C语言智力问题
2016-08-04 09:41
295 查看
五位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:A选手说:B第一,我第三,B选手说:我第二,E第四,C选手说:我第一,D第二,D选手说:C最后我第三,E选手说:我第四,A第一;比赛结束后,每位选手都说对了一半,请你猜测比赛的名次
看到这道问题当然开始的想法就是列举法,将每种情况都列举一遍,最终满足题意要求的就是正确的比赛结果,那仫如何编程实现呢?既然是穷举法用程序实现就是五个for循环,将每种情况穷举一遍满足题意的就是结果,那仫我开始实现的版本就是:#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int main() { int a=0,b=0,c=0,d=0,e=0; for(a=1;a<=5;a++) { for(b=1;b<=5;b++) { for(c=1;c<=5;c++) { for(d=1;d<=5;d++) { for(e=1;e<=5;e++) { if(((b == 1)+(a == 3) == 1) && ((b == 2)+(e == 4) == 1) && ((c == 1)+(d == 2) == 1) && ((c == 5)+(d == 3) == 1) && ((e == 4)+(a == 1) == 1)) { printf("a=%d b=%d c=%d d=%d e=%d\n",a,b,c,d,e); } } } } } } system("pause"); return 0; }
虽然使用五个for循环得出了结果:
但是有的结果却是不符合实际情况的,因为在实际比赛中名次是可以并列的,但是必须存在第一名,而且名次必须是连续的,通过观察上述比赛结果发现有很多都是不正确的结果,那仫如何去排除这些不符合实际的排序结果呢?
想法思路如下:
如果有一个整形的数据它的32位都为0,在满足题意的情况下我们将它的对应位置置为1,也就是说该运动员是第几名就将该位置的0置为1,通过置位之后此时我们只需要判断这个数据的低几位是否连续就可以了,如果低位没有连续的1,就将标志位置1,而存在连续的1也就是满足题意的结果直接输出就可以了;下面是我的一个简单分析图:
完整的代码实现如下:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int main() { int tmp=0,flag=0; int a=0,b=0,c=0,d=0,e=0; for(a=1;a<=5;a++) { for(b=1;b<=5;b++) { for(c=1;c<=5;c++) { for(d=1;d<=5;d++) { for(e=1;e<=5;e++) { if(((b == 1)+(a == 3) == 1) && ((b == 2)+(e == 4) == 1) && ((c == 1)+(d == 2) == 1) && ((c == 5)+(d == 3) == 1) && ((e == 4)+(a == 1) == 1)) { tmp |= (1 << (a-1)); //是第几名就将对应的位置置为1 tmp |= (1 << (b-1)); tmp |= (1 << (c-1)); tmp |= (1 << (d-1)); tmp |= (1 << (e-1)); flag=0; while(tmp) { if(tmp%2 == 0) { flag=1; //低位没有连续的1 } tmp/=2; } if(flag == 0) printf("a=%d b=%d c=%d d=%d e=%d\n",a,b,c,d,e); } } } } } } system("pause"); return 0; }
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为四个嫌疑犯的一个,以下为四个嫌疑犯的供词:A说:不是我,B说:是C,C说:是D,D说:C在说胡话;已知只有三个人说了真话有一个人说了假话,请确定杀人者是谁,详情请见下面链接:
http://blog.csdn.net/qq_34328833/article/details/51010865
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C 语言简单加减乘除运算
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言判断一个数是否是2的幂次方或4的幂次方
- C语言二进制思想以及数据的存储
- C语言中计算正弦的相关函数总结