POJ 3075 - Tic-Tac-Toe

http://poj.org/problem?id=3075

概要

三目並べの盤面が与えられるので,終了状態として正しいかどうか答える.

制約

特になし

解法

やるだけ.

 1 #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 }
poj/3075.cc