Janken

Time Limit : 2 sec, Memory Limit : 65536 KB

E - じゃんけん

問題文

E 君はじゃんけんが大好きである (ちなみにじゃんけんのルールについてはWikipediaのじゃんけんのページを参照せよ). ある日,町内でじゃんけん大会があるということを知った E 君は,じゃんけんの腕に自信があったこともあり早速出場することにした. ところが大会当日,E 君を待ち受けていたのは,普通の「グー・チョキ・パー」のみからなる普通のじゃんけんではなく, より多くの手からなる一般化されたじゃんけんであった.

一般化されたじゃんけんは 2 人のプレイヤーで行われるゲームである. まず,2 人にはこのじゃんけんにおいて使用出来る手の個数 N と,N 個の手の勝敗関係を示す表が伝えられる. そして,通常のじゃんけんと同じように同時に手を出しあい,伝えられた手の勝敗関係に基いて勝敗を決める.これを 1,000 回 繰り返す. 1 回のじゃんけんの勝敗の結果によって得点が手に入り,相手に勝利した場合は 3 点,相手と「あいこ」になった場合は 1 点が手に入る.相手に負けてしまった場合は得点を得られない.

このなんだかよくわからないルールのじゃんけんにすっかり戦意を喪失してしまった E 君であったが,どうやら聞くところによると,最終的に相手に得点で勝てなくても,350 点以上を獲得すれば何か景品がもらえるらしい. めんどくさいので 350 点を得てさっさと大会を後にすることにした.

この問題の目的は,一般化されたじゃんけんをプレイする AI を作成し,ジャッジ側の用意した AI と対戦させて 350 点以上を獲得することである.

入出力形式

まず入力が以下の形式で与えられる.

N
a1,1 ... a1,N 
...
aN,1 ... aN,N

N はじゃんけんの手の数である.
ai,jN 個の手の勝敗関係を表す. ai,j-ox のいずれかであり,- ならば手 i が手 j に対し引き分けることを,o ならば手 i が手 j に対し勝つことを,x なら負けることを示す.

この条件の下で 1,000回 AI とじゃんけんをする.

プログラムは自分の使う手を出力すると,ジャッジの AI が使った手を入力で受けとる事ができる. 例えば C/C++で 3 番目の手を使う場合は

printf("3\n"); fflush(stdout);

とする.次に,

scanf("%d", &judge_ai_hand);

とすると変数 judge_ai_hand にジャッジの AI が使った手が入る. なおじゃんけんの手は1-indexedである.

1,000 回のじゃんけんを終えた後は直ちにプログラムを終了せよ.その後,獲得できた得点の合計が 350 点以上であれば正答と判定される.

制約

  • 3 ≤ N ≤ 10
  • i ≠ j のとき,ai,j ∈ { o, x } であり, ai,j=oaj,i=x または ai,j=xaj,i=o のどちらか片方が成り立つ.
  • i = j のとき, ai,j=- である.
  • AI の出す手は勝敗関係の表 ai,j と AI の過去の手にだけ依存し,競技者のプログラムの過去の手や直前に出した手には依存しない.
  • N は整数である.
  • データセットに N=10 のテストケースは高々 6 個しか含まれていない.

入出力例1

じゃんけんの説明プログラムの出力プログラムへの入力
4 -oox x-oo xx-o oxx-
1 回目に競技者の AI が使った手1
1 回目にジャッジの AI が使った手2
... ... ...
1,000 回目に競技者の AI が使った手4
1,000 回目にジャッジの AI が使った手3

最初にプログラムはじゃんけんの手の表を受け取る.その後,1,000 回のじゃんけんを行う. ここで,1 回目のじゃんけんでは競技者の AI はジャッジの AI に勝利しているが, 1,000 回目のじゃんけんでは競技者の AI はジャッジの AI に敗北していることに注意せよ.


Writer: 楠本充,小浜翔太郎
Tester: 森槙悟

Source: Kyoto University Programming Contest 2012 , Kyoto, Japan, 2012-07-01
http://www.kupc.jp/
http://kupc2012.contest.atcoder.jp/