プログラムの実行結果は以下の通り。
Find \ : A B C D A : − グー チョキ パー B : チョキ − パー グー C : パー グー − チョキ D : グー チョキ パー −
CはDにチョキを出して1勝したことが判る。
プログラムのソースは以下の通り。
#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) {
if( x == y) return 0; // あいこ
if( abs(x-y) == 1) return -(x-y); // 差が1の時は小さい方が勝ち
if( abs(x-y) == 2) return (x-y); // 差が2の時は大きい方が勝ち(グーとパー)
pe( "ProgramError(x:%d,y:%d)\n");
return 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;
for( int ib=0; ib< 4; ib++) {
if( ib != 1 && judge( abcd[1][ib], abcd[ib][1]) > 0) bwin++;
}
int cwin = 0;
for( int ic=0; ic< 4; ic++) {
if( ic != 2 && judge( abcd[2][ic], abcd[ic][2]) > 0) cwin++;
}
int dwin = 0;
for( int id=0; id< 4; id++) {
//if( id != 3 && judge( abcd[3][id], abcd[id][3]) > 0) dwin++;
}
if( bwin == 2 && cwin == 1 && dwin == 0) {
ps( "Find\n");
ps( "\ : A B C D \n");
for( int x=0; x< 4; x++) {
ps( "%.2s : ", "ABCD"+2*x);
for( int y=0; y< 4; y++) {
ps( "%s ", sgcp[abcd[x][y]]);
}
ps( "\n");
}
}
}
}
}
}
}
return 0;
}