a53

JocDeSah

a53
Jun 6th, 2020
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.73 KB | None | 0 0
  1. #include <fstream>
  2. #include <queue>
  3. #include <vector>
  4. #include <tuple>
  5.  
  6. using namespace std;
  7. using pi = pair<int, int>;
  8.  
  9. ifstream cin("jocdesah.in");
  10. ofstream cout("jocdesah.out");
  11.  
  12. int main()
  13. {
  14. int c, n, di[] = { -1,0,0,1 }, dj[] = { 0,-1,1,0 };
  15. cin >> c >> n;
  16. vector<vector<char>> x(n, vector<char>(n));
  17. vector<pi> K;
  18. for (int i = 0; i < n; ++i)
  19. for (int j = 0; j < n; ++j)
  20. {
  21. cin >> x[i][j];
  22. if (x[i][j] == 'K')
  23. K.emplace_back(i, j);
  24. }
  25. int hans = -1, minlen = 100000;
  26. pi queenpoz, kingpoz;
  27. for (const auto& king:K)
  28. for (int d = 0, ok = 1; d <= 16 && ok; ++d)
  29. {
  30. vector<bool> c(4);
  31. for (int i = 0; i < 4; ++i)
  32. if (d & (1 << i))
  33. c[i] = 1;
  34. queue<pi> q;
  35. vector<vector<int>> f(n, vector<int>(n));
  36. f[king.first][king.second] = 1;
  37. q.emplace(king);
  38. while (!q.empty())
  39. {
  40. int i, j;
  41. tie(i, j) = q.front();
  42. q.pop();
  43. for (int k = 0; k < 4; ++k)
  44. {
  45. int iv = i + di[k], jv = j + dj[k];
  46. if (iv >= 0 && jv >= 0 && iv < n && jv < n && f[iv][jv] == 0 && !(x[iv][jv] == 'K' || x[iv][jv] == 'P' && !c[0] || x[iv][jv] == 'C' && !c[1] || x[iv][jv] == 'N' && !c[2] || x[iv][jv] == 'T' && !c[3]))
  47. {
  48. f[iv][jv] = f[i][j] + 1;
  49. if (x[iv][jv] == 'Q')
  50. {
  51. int hcur = 16 - d;
  52. if (hcur > hans || (hcur == hans && f[iv][jv] < minlen))
  53. {
  54. ok = 0;
  55. hans = hcur;
  56. minlen = f[iv][jv];
  57. kingpoz = king;
  58. queenpoz = make_pair(iv, jv);
  59. }
  60. while (!q.empty())
  61. q.pop();
  62. break;
  63. }
  64. q.emplace(iv, jv);
  65. }
  66. }
  67. }
  68. }
  69. if (c == 2)
  70. {
  71. int d = 16 - hans;
  72. vector<bool> c(4);
  73. for (int i = 0; i < 4; ++i)
  74. if (d & (1 << i))
  75. c[i] = 1;
  76. vector<vector<int>> f(n, vector<int>(n));
  77. queue<pi> q;
  78. q.emplace(queenpoz);
  79. f[queenpoz.first][queenpoz.second] = 1;
  80. while (!q.empty())
  81. {
  82. int i, j;
  83. tie(i, j) = q.front();
  84. q.pop();
  85. for (int k = 0; k < 4; ++k)
  86. {
  87. int iv = i + di[k], jv = j + dj[k];
  88. if (iv >= 0 && jv >= 0 && iv < n && jv < n && f[iv][jv] == 0 && !(x[iv][jv] == 'Q' || x[iv][jv] == 'P' && !c[0] || x[iv][jv] == 'C' && !c[1] || x[iv][jv] == 'N' && !c[2] || x[iv][jv] == 'T' && !c[3]))
  89. {
  90. f[iv][jv] = f[i][j] + 1;
  91. if (f[iv][jv] < minlen)
  92. q.emplace(iv, jv);
  93. }
  94. }
  95. }
  96. cout << minlen << '\n';
  97. int i, j;
  98. tie(i, j) = kingpoz;
  99. cout << 1 + i << ' ' << 1 + j << '\n';
  100. for (int iv, jv; f[i][j] != 1; i = iv, j = jv, cout << 1 + i << ' ' << 1 + j << '\n')
  101. for (int k = 0; k < 4; ++k)
  102. {
  103. iv = i + di[k], jv = j + dj[k];
  104. if (iv >= 0 && jv >= 0 && iv < n && jv < n && f[i][j] - 1 == f[i + di[k]][j + dj[k]])
  105. break;
  106. }
  107. }
  108. else cout << hans;
  109. }
Add Comment
Please, Sign In to add comment