fork download
  1. #define CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <bits/stdc++.h>
  4. #include <ext/pb_ds/assoc_container.hpp>
  5. #include <ext/pb_ds/tree_policy.hpp>
  6.  
  7. using namespace __gnu_pbds;
  8. using namespace std;
  9. typedef long long ll;
  10. typedef long double ld;
  11. typedef unsigned long long ull;
  12. #define ordered_set tree<pair<ll,ll>, null_type, less <pair<ll,ll>>, rb_tree_tag, tree_order_statistics_node_update>
  13. #define ll long long
  14. #define all(name) name.begin(),name.end()
  15. #define rall(name) name.rbegin(),name.rend()
  16. #define sz(s) (int)s.size()
  17. const int N = 2e6 + 10, mod = 1e9 + 7;
  18. const double PI = asin(1.0) * 2;
  19. const int OO = 0x3f3f3f3f;
  20. int dx[]{1, -1, 0, 0, 1, 1, -1, -1};
  21. int dy[]{0, 0, 1, -1, 1, -1, 1, -1};
  22.  
  23. void fast() {
  24. std::ios_base::sync_with_stdio(0);
  25. cin.tie(0);
  26. cout.tie(0);
  27. }
  28.  
  29. map<string, bool> mp;
  30.  
  31. bool isWin(string s) {
  32. return (
  33. // row
  34. (s[0] != '.' && s[0] == s[1] && s[0] == s[2]) ||
  35. (s[3] != '.' && s[3] == s[4] && s[3] == s[5]) ||
  36. (s[6] != '.' && s[6] == s[7] && s[6] == s[8]) ||
  37. // col
  38. (s[0] != '.' && s[0] == s[3] && s[0] == s[6]) ||
  39. (s[1] != '.' && s[1] == s[4] && s[1] == s[7]) ||
  40. (s[2] != '.' && s[2] == s[5] && s[2] == s[8]) ||
  41. // diag
  42. (s[0] != '.' && s[0] == s[4] && s[0] == s[8]) ||
  43. (s[0] != '.' && s[2] == s[4] && s[2] == s[6])
  44. );
  45. }
  46.  
  47. void bfs(string s = ".........") {
  48. queue<pair<string, bool>> q; // grid, player( X --> 1, O --> 0)
  49. q.push({s, 1});
  50. while (!q.empty()) {
  51. pair<string, bool> p = q.front();
  52. q.pop();
  53. string grid = p.first;
  54. for (int i = 0; i < 9; i++) {
  55. if (grid[i] == '.') {
  56. if (p.second) grid[i] = 'X'; else grid[i] = 'O';
  57. if (!isWin(grid))
  58. q.push({grid, p.second ^ 1});
  59. if (isWin(grid))
  60. mp[grid] = 1;
  61. grid[i] = '.';
  62. }
  63. }
  64. }
  65. }
  66.  
  67. void solve() {
  68. string s;
  69. bfs();
  70. while (cin >> s) {
  71. if (s == "end")
  72. break;
  73. cout << (mp[s] ? "valid\n" : "invalid\n");
  74. }
  75. }
  76.  
  77. int main() {
  78. fast();
  79. //freopen("abc.in", "r", stdin);
  80. //freopen("output.txt", "w", stdout);
  81. int T = 1;
  82. //cin >> T;
  83. while (T--) {
  84. solve();
  85. }
  86. return 0;
  87. }
Success #stdin #stdout 0.09s 7812KB
stdin
Standard input is empty
stdout
Standard output is empty