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