日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个
嫌疑犯的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
思路:
- 搞一个数组,用于存储当前谁是凶手,是凶手的为1,不是的为0
- 每次进入循环时更改一次凶手的可能
- 列出嫌犯供词 表达式,即if语句内的判断条件,当3个条件为真时,跳出循环,即当前位置将会被标记为凶手
- if语句若未执行,则将数组对应位置改回0
//清空数组:
void Init(int *arr, int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
*(arr + i) = 0;
}
}
int main()
{
int arr[4] = { 0 };
Init(arr, 4);
int i = 0;
for (i = 0; i < 4; i++)
{
arr[i] = 1; //赋值下标为i的数组元素为1
if ((arr[0] != 1) +
(arr[2] == 1) +
(arr[3] == 1) +
(arr[3] != 1) == 3) //3个表达式为真(1),一个表达式为假(0),相加得3
break;
arr[i] = 0; //不成立就改回来
}
switch (i)
{
case 0:
printf("A是凶手\n");
break;
case 1:
printf("B是凶手\n");
break;
case 2:
printf("C是凶手\n");
break;
case 3:
printf("D是凶手\n");
break;
}
}
这道题也可以不用数组,只用一个数字来记录凶手,进行判断即可(主要是看以前写的代码有点蠢,优化空间很大哈哈)
int main()
{
for (int i = 0; i < 4; i++)
{
if ((i != 0) +
(i == 2) +
(i == 3) +
(i != 3) == 3) //3个表达式为真(1),一个表达式为假(0),相加得3
{
char ch[] = {'A', 'B', 'C', 'D'};
printf("%c是凶手\n", ch[i]);
}
}
}