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件出力されました。
解速度
即