シーン:
ある場所で殺人事件が発生し、警察は捜査の結果、容疑者4名を特定し、そのうちの1名が殺人犯であると考えられます。
Aは言いました:私ではありません
B は言いました: はい C
C は言いました: はい D
D は言いました: C はナンセンスを話しています
1 人が嘘をつき、3 人が真実を言うことが知られていますか? 殺人者は誰ですか?
分析します:
この問題を推論するとき、A、B、C、D を 1 人ずつ殺人犯と仮定し、「1 人が嘘、3 人が真実」の条件を満たすと判断します。
仮定A | 仮定B | 仮定C | 仮定D | |
あ | × | √ | √ | √ |
B | × | × | √ | × |
C | × | × | × | √ |
D | √ | √ | √ | × |
上の表の分析によれば、C が殺人犯であることがわかります。
コード:
int main()
{ 文字キラー = 0; for (キラー = 'A'; キラー <= 'D'; キラー++) { if ((キラー != 'A') + (キラー == 'C') + (キラー == 'D') + (キラー ! = 'D') == 3) { printf("%c\n", キラー); 0 を 返します。}
要約:
上記のチェックマークと間違った符号を 1 と 0 と考えます。したがって、3 つのチェックマークを直接判断すると、1+1+1+0 = 3 となります。シミュレーション結果は推論結果と同じになります。
シーン:
10メートル高飛び込み競技には5名の選手が出場し、予想は以下の通り。
A は言いました: B が 2 番目、私が 3 番目
B は言いました: 私は 2 番目、E は 4 番目です
C は言いました: 私が 1 番目で、D が 2 番目です
Dは言いました:Cは最後、私は3番目です
E は言いました: 私は 4 番目、A は 1 番目です
各プレイヤーの正解は半分だけであることが知られており、プログラミングがゲームのランキングを決定します。
分析します:
上記の殺人犯の例によれば、各人が2つの条件を述べたと分析できます。正解と不正解が 1 つずつあります。つまり、0 と 1 が 1 つずつあります。各プレイヤーの順位は 1 ~ 5 であるため、すべての順位をリストし、条件の半分を満たしているかどうかを判断します。
コード:
#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))
{
if(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;
}
要約:
考えられるすべての注文状況をリストし、最終条件を満たすようにします。上記が 120 になるのは、2 人が同じ順位になるのを防ぐため、1*2*3*4*5 = 120 となるためです。