AOJ_2273 Shiritori
問題
解法
対話型プログラムを書く変わった問題。おもしろい。
AIの単語をsetを使って記録しておく。
自分の言う言葉の生成方法はいろいろあるが、bitで管理することにした。
具体的には以下
変数iを用意して0で初期化する。
(1) i++;
(2) 単語生成
1文字め…AIの最後の文字
2文字め…iの下1Bit目が, 1なら 'p', 0なら'o'
3文字め…iの下2Bit目が, 1なら 'p', 0なら'o'
...
n(<=9)文字め…iの下(n-1)Bit目が, 1なら 'p', 0なら'o'
10文字め…'n'
ぽぽぽぽーーんってなるのをねらっていたけど、
50回までで決着がついてしまう…orz
#include <cstdio> #include <algorithm> #include <string> #include <cstring> #include <set> using namespace std; typedef set<string> S; int main(){ char ai[3]; char pr[11] = "poooooooon"; int i = 0; S siritori; siritori.insert(string(pr)); while(true){ printf("?%s\n", pr); fflush(stdout); scanf("%s", ai); S::iterator it = siritori.find(string(ai)); if(ai[0] != 'n' || it != siritori.end() || !(ai[1] == 0 || ('a' <= ai[1] && ai[1] <= 'z'))){ //勝ちました printf("!OUT\n"); return 0; } siritori.insert(string(ai)); char c; ++i; if(ai[1] == 0) c = ai[0]; else c = ai[1]; pr[0] = c; for(int k = 1; k <= 8; k++){ if((i >> (k-1)) & 1 == 1) pr[k] = 'p'; else pr[k] = 'o'; } } return 0; }