コードにするのに30分ぐらいでした。が、昨夜のうちに問題をちらっと見てしまっていたので考えてた時間は結構長いです。
お題はこちらです。
http://nabetani.sakura.ne.jp/hena/1/
…。
ちょっとミスってたのでコソっと修正。
#include <iostream>
#include <string>
enum Result { FAUL_X_WON, FAUL_O_WON, O_WON, X_WON, DRAW_GAME };
Result doukaku(const std::string& t)
{
int board[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
for(int i = 0; i < 9; ++i)
{
if(board[t[i] - '0' - 1] != 0)
{
return static_cast<Result>(i % 2);
}
board[t[i] - '0' - 1] = i % 2 + 1;
if( (board[0] & board[1] & board[2]) ||
(board[3] & board[4] & board[5]) ||
(board[6] & board[7] & board[8]) ||
(board[0] & board[3] & board[6]) ||
(board[1] & board[4] & board[7]) ||
(board[2] & board[5] & board[8]) ||
(board[0] & board[4] & board[8]) ||
(board[2] & board[4] & board[6]))
{
return static_cast<Result>((i % 2) + 2);
}
}
return DRAW_GAME;
}
int main(int, char* [])
{
std::string s;
while((std::cin >> s).good())
{
switch(doukaku(s))
{
case FAUL_X_WON: std::cout << "Faul: x won.\n"; break;
case FAUL_O_WON: std::cout << "Faul: o won.\n"; break;
case X_WON: std::cout << "x won.\n"; break;
case O_WON: std::cout << "o won.\n"; break;
default: std::cout << "Draw game.\n"; break;
}
}
return 0;
}