编程解决有趣的智力题
目录
- 预测比赛名次
- 找凶手
预测比赛名次
题目描述:
思路:
核心就在于怎么用代码表示"只对了一半"
也就是一真一假 1和0 那就是1+0=1
其次怎么让名次唯一
让名次唯一:
我试了A+B+C+D+E==15 不行
我试了(A != B) && (B != C) && (C != D) && (D != E) 也不行
A * B * C * D * E == 120 这个值肯定是唯一的 彳亍!!
参考代码:
#include<stdio.h>
int main()
{
int A = 0;
int B = 0;
int C = 0;
int D = 0;
int 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 == 2) + (A == 3) == 1)
&& ((B == 2) + (E == 4) == 1)
&& ((C == 1) + (D == 2) == 1)
&& ((C == 5) + (D == 3) == 1)
&& ((E == 4) + (A == 1) == 1)
&& (A * B * C * D * E == 120)
)
{
printf("A:%d B:%d C:%d D:%d E:%d\n", A, B, C, D, E);
}
}
}
}
}
}
return 0;
}
找凶手
题目描述:
思路1:
ABCD四个人 每个人都有0或者1两种取值
0代表清白 1代表是凶手
四个人的描述都加起来 结果应该是3 因为有三个人说真话
但是凶手只有一个 所以A+B+C+D = 1
思路1参考代码:
int main()
{
int A = 0;
int B = 0;
int C = 0;
int D = 0;
for (A = 0; A <= 1; A++)
{
for (B = 0; B <= 1; B++)
{
for (C = 0; C <= 1; C++)
{
for (D = 0; D <= 1; D++)
{
if (
((A == 0) + (C == 1) + (D == 1) + (D == 0)) == 3
&& (A + B + C + D) == 1
)
{
printf("%d %d %d %d\n", A, B, C, D);
}
}
}
}
}
return 0;
}
思路2:
定义出killer 假设killer是A B C D
然后写出四个人对应的描述
加起来结果是3 看看哪个猜测是对的
其实这个代码更符合我们人的思考模式