C言語を用いて論理問題を解決する——列挙法のプログラミング実現


人間の脳のコンピュータに対する違いは、人間の脳が考えることにある.では、いくつかの論理問題の解では、人間の脳はコンピュータより優れているに違いない.一つの論理問題に対して、人間の脳処理の方法は一般的に分析、推理して結論を出す.コンピュータは异なって、分析、推理のこれらの机能、コンピュータはすべてなくて、しかし人の计算の能力は强大です.人間の脳にとって、列挙法を用いて論理問題を解決するのは面倒で、計算量は非常に大きいかもしれないが、これはコンピュータにとって問題ではなく、論理推理よりも結論を出すのが速いかもしれない.次に例を示します.
  • の5人の選手は10メートル台のダイビング試合に参加して、ある人は彼らに試合の結果を予測させてA選手は言います:Bは2番目で、私は3番目です;B選手は「私は2位、Eは4位」と言いました.C選手は「私が1位、Dが2位」と言いました.D選手は「C最後、私は3番目です.E選手は「私は4位、Aは1位」と言いました.試合が終わったら、選手一人一人が半分正しいと言って、試合の順位を確定してください.分析:ここは全部でABCDEが5人いるので、全部で5!=120種類の配列方法.しかし、C言語で120種類の組み合わせを挙げるのは面倒なので、直接5つのforループを使って55種類の組み合わせを列挙し、ifを使って条件判定を行ったほうがいい.

  • 関数コードは次のとおりです.
    void function1()
    {
    	int a, b, c, d, e;
    	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) + (c == 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
    "
    , a, b, c, d, e); break; } }
  • 日本のある場所で殺人事件が発生し、警察は殺人犯が以下の4人の容疑者のうちの1人であることを捜査を通じて確定した.以下は4人の容疑者の供述.Aは言います:私ではありません.BはCです.CはDだと言った.Dは、Cは3人が本当のことを言ったことを知っていて、1人はうそをついています.今、これらの情報に基づいて、誰が犯人なのかを確認してください.解析:同様に、列挙法を使用します.全部で4種類の配列の組み合わせしかないので、forループを1つ使えば十分です.

  • 関数コードは次のとおりです.
    void function2()
    {
    	char killer;
    	for (killer = 'A'; killer <= 'D'; killer++)
    	{
    		if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)
    			printf("killer is %c
    "
    , killer); } }

    コンピュータがこんなに強くて、コンパイルが実行されて、結果が出てくることがあります.あなたが推理を一歩一歩分析すれば、手がかりを整理している間に、コンピュータはもう終わったかもしれません.