朝日新聞2005年8月5日のパズル横丁問題

問題

A,B,C,Dの4人が総当たりでジャンケンをする。グー,チョキ,パーを一回だけ出し,引き分けは無かった。

Aは全勝,Bは2勝,Cは1勝,Dは全敗した。AはBにグーを出して勝ったとすると,Cは何を出して1勝したか?

解答への道(ヒント)

昨日(8/5)は車で外出。帰りに高速の入り口でETCバーが開かず恥ずかしい思いをした。カードはちゃんと挿していたのに。こういうこともあるんだ。

星2つ問題。頭で考えると難しいのか。プログラマはいきなりプログラムを考えるぞ。

以下のような対戦表を考える。

縦が自分,横が対戦相手。例えば以下の表はBがGを相手にグー(G)を出したことを意味する。

AがB,C,Dを相手に出す手の数は

3個のマスにグー,チョキ,パーを入れることになるから,6通りある。B,C,Dについても6通りあるので,全部で6x6x6x6通りある。

これを虱潰せば答えが出る。

プログラムは以下のようになる。

#include "puzutl.h"

#define G 1                     // グー
#define C 2                     // チョキ
#define P 3                     // パー

int gcp[6][3] = {               // グー,チョキ,パーの出し方(6通り)
  {G,C,P},
  {G,P,C},
  {C,G,P},
  {C,P,G},
  {P,G,C},
  {P,C,G}
};

int judge( int x, int y) {
  x が y に勝てば正数を
  x が y に勝てば負数を
 引き分けの場合 0 を返す
}

int abcd[4][4];                 // 対戦表
cstring sgcp[] = { " − ","グー ","チョキ","パー "}; // 解の出力用

int main( int argc, cstring argv[])
{
  for( int a=0; a< 6; a++) {
    abcd[0][1] = gcp[a][0];
    abcd[0][2] = gcp[a][1];
    abcd[0][3] = gcp[a][2];
    for( int b=0; b< 6; b++) {
      abcd[1][0] = gcp[b][0];
      abcd[1][2] = gcp[b][1];
      abcd[1][3] = gcp[b][2];
      for( int c=0; c< 6; c++) {
        abcd[2][0] = gcp[c][0];
        abcd[2][1] = gcp[c][1];
        abcd[2][3] = gcp[c][2];
        for( int d=0; d< 6; d++) {
          abcd[3][0] = gcp[d][0];
          abcd[3][1] = gcp[d][1];
          abcd[3][2] = gcp[d][2];
          //------------------------------------------------------------
          // abcd[][] がa,b,c,dがじゃんけんをした結果表になる。
          // 勝ち負けを判定する。
          //------------------------------------------------------------
          if( abcd[0][1] == G && abcd[1][0] == C &&// AはBにグーで勝ち
              judge( abcd[0][2], abcd[2][0]) > 0 && judge( abcd[0][3], abcd[3][0]) > 0) { // C,Dにも勝ってAは全勝
            int bwin = 0;
            int cwin = 0;
            int dwin = 0;
            B,C,Dの勝ち数を計算する。
            if( bwin == 2 && cwin == 1 && dwin == 0) {
              ps( "Find\n");
            }
          }
        }
      }
    }
  }
  return    0;
}

答えは1件出力されました。

解速度