問題
http://community.topcoder.com/stat?c=problem_statement&pm=12474&rd=15494
2人のプレイヤーが交互に行うゲーム。
それぞれ正の整数が与えられる。
各ターンにて、プレイヤーはその数字を10で割るか、逆にすることができる。
このとき、最初のプレイヤーの数字を2人目のプレイヤーの数字に一致させることができるかどうかを答える。
ターン数は最大で1000。
解き方
2人目のプレイヤーの数字にすることができれば、
その後の操作は全て一緒にできるので答えは必ずYESになる。
仮に一緒にできなければ、2人目のプレイヤーは数字をひっくり返し続けてればよいのでNOとなる。
待ち伏せる場合、2人目のプレイヤーが逆になるのを待ち伏せる場合は逆にできないので例外、と考えがちだが、逆の数字にできるということは最初の数字にもできるということなので問題ない。
Challenge
2人の操作で1ターンではなく、1人のプレイヤーの操作が終われば1ターンで、
そこで判定できることを見逃してしまった。問題文の理解ミスです。
sprintfはchar型で使うのですが、stringをchar変換しようとしたらうまくいかなかったです。そのままchar型を宣言して使いました。
コード
class TheNumberGame {
public:
string determineOutcome(int A, int B) {
bool win=false;
char tx[15],ty[15];
sprintf(tx,"%d",A);
sprintf(ty,"%d",B);
string x=tx,y=ty;
if(x.find(y)!=string::npos)win=true;
reverse(y.begin(),y.end());
if(x.find(y)!=string::npos)win=true;
return win ? "Manao wins" :"Manao loses";
}
};
public:
string determineOutcome(int A, int B) {
bool win=false;
char tx[15],ty[15];
sprintf(tx,"%d",A);
sprintf(ty,"%d",B);
string x=tx,y=ty;
if(x.find(y)!=string::npos)win=true;
reverse(y.begin(),y.end());
if(x.find(y)!=string::npos)win=true;
return win ? "Manao wins" :"Manao loses";
}
};