POJ 3075 - Tic-Tac-Toe
http://poj.org/problem?id=3075
概要
三目並べの盤面が与えられるので,終了状態として正しいかどうか答える.
制約
特になし
解法
やるだけ.
poj/3075.cc1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 bool ok(const string& s) 6 { 7 const int X = count(s.begin(), s.end(), 'X'); 8 const int O = count(s.begin(), s.end(), 'O'); 9 if (!(X == O || X == O+1)) { 10 return false; 11 } 12 13 static const int tbl[][3] = { 14 {0, 4, 8}, 15 {2, 4, 6}, 16 {0, 1, 2}, 17 {3, 4, 5}, 18 {6, 7, 8}, 19 {0, 3, 6}, 20 {1, 4, 7}, 21 {2, 5, 8}, 22 }; 23 bool win[2] = {false, false}; 24 for (int d = 0; d < 8; d++) { 25 if (s[tbl[d][0]] != '.' 26 && s[tbl[d][0]] == s[tbl[d][1]] 27 && s[tbl[d][1]] == s[tbl[d][2]]) { 28 if (s[tbl[d][0]] == 'X') { 29 win[0] = true; 30 } else { 31 win[1] = true; 32 } 33 } 34 } 35 if (win[0] && win[1]) { 36 return false; 37 } else if (!win[0] && win[1]) { 38 return X == O; 39 } else if (win[0] && !win[1]) { 40 return X == O+1; 41 } else { 42 return count(s.begin(), s.end(), '.') == 0; 43 } 44 } 45 46 int main() 47 { 48 string s; 49 while (cin >> s && s != "end") { 50 cout << (ok(s) ? "" : "in") << "valid" << endl; 51 } 52 return 0; 53 }