/* Check cf5-opt.vim defs. VIM: let g:lcppflags="-std=c++11 -O2 -pthread" VIM: let g:wcppflags="/O2 /EHsc /DWIN32" VIM: let g:cppflags=g:Iboost.g:Itbb VIM: let g:ldflags=g:Lboost.g:Ltbb.g:tbbmalloc.g:tbbmproxy VIM: let g:ldlibpath=g:Bboost.g:Btbb VIM: let g:argv=" < tic_tac_toy_tomek.sample_input" */ #include #include #include #include #include //typedef std::vector> puzzle_type; typedef unsigned puzzle_type; void read_puzzle( puzzle_type& puzzle ) { static const int _ = '.'; static const int t = 'T'; static const int x = 'X'; static const int o = 'O'; puzzle = 0; std::string line; for ( int i = 0; i < 4; ++i ) { std::getline(std::cin,line); if ( line.size() != 4 ) throw std::runtime_error( "input error" ); for ( int j = 0; j < 4; ++j ) { int c = line[j]; if ( c == '.' ) c = 0; else if ( c == 'T' ) c = 1; else if ( c == 'X' ) c = 2; else if ( c == 'O' ) c = 3; else throw std::runtime_error( "input error" ); puzzle = (puzzle << 2) | c; } } // // Read empty line. // std::getline(std::cin,line); if ( line.size() != 0 ) throw std::runtime_error( "input error" ); } // possoble states int states[5][4] = { //. T X O { 4,0,1,2 }, // 0 - init { 4,1,1,3 }, // 1 - x { 4,2,3,2 }, // 2 - o { 4,3,3,3 }, // 3 - nowin no empty { 4,4,4,4 }, // 3 - nowin and empty }; int solve_puzzle( puzzle_type& puzzle ) { bool has_empty = false; for ( int i = 0; i < 4; ++i ) { int s = 0; unsigned p = puzzle >> i*8; for ( int j = 0; j < 4; ++j, p >>= 2 ) s = states[s][ p & 0x03 ]; if ( s == 1 ) return 0; else if ( s == 2 ) return 1; else if ( s == 4 ) has_empty = true; } for ( int i = 0; i < 4; ++i ) { int s = 0; unsigned p = puzzle >> i*2; for ( int j = 0; j < 4; ++j, p >>= 8 ) s = states[s][ p & 0x03 ]; if ( s == 1 ) return 0; else if ( s == 2 ) return 1; } { int s = 0; unsigned p = puzzle; for ( int j = 0; j < 4; ++j, p >>= 10 ) s = states[s][ p & 0x03 ]; if ( s == 1 ) return 0; else if ( s == 2 ) return 1; } { int s = 0; unsigned p = puzzle >> 6; for ( int j = 0; j < 4; ++j, p >>= 6 ) s = states[s][ p & 0x03 ]; if ( s == 1 ) return 0; else if ( s == 2 ) return 1; } return ( has_empty ) ? 2 : 3; } const char * msg [] = { "X won", "O won", "Game has not completed", "Draw" }; int main ( void ) {try{ int puzzle_count; puzzle_type puzzle; std::cin >> puzzle_count; std::cin.ignore(std::numeric_limits::max(),'\n'); for ( int i = 0; i < puzzle_count; i++ ) { read_puzzle(puzzle); int s = solve_puzzle(puzzle); std::cout << "Case #" << (i+1) << ": " << msg[s] << std::endl; } return 0; } catch ( const std::exception& e ) { std::cerr << std::endl << "std::exception(\"" << e.what() << "\")." << std::endl; return 2; } catch ( ... ) { std::cerr << std::endl << "unknown exception." << std::endl; return 1; }}