fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll long long
  6. #define ull unsigned ll
  7. #define ld long double
  8. typedef vector<int> vi;
  9. typedef multiset<int> mi;
  10. typedef multiset<ll> mll;
  11. typedef vector<ll> vll;
  12. typedef vector<bool> vb;
  13. typedef vector<string> vs;
  14. typedef set<ll> sll;
  15. typedef vector<vector<int>> _2vi;
  16. typedef vector<vector<ll>> _2vll;
  17. #define all(v) ((v).begin()), ((v).end())
  18. #define sz(v) ((ll)((v).size()))
  19.  
  20. #define vinp(v, n) \
  21.   for (ull i = 0; i < (n); i++) \
  22.   cin >> (v)[i]
  23. #define printv(v) \
  24.   for (auto i : (v)) \
  25.   cout << i << " "
  26. #define fr0(i, n) for (ull(i) = 0; (i) < (n); (i)++)
  27. #define fr1(i, n) for (ull(i) = 1; (i) < (n); (i)++)
  28. #define fr(i, x, n) for (ull(i) = (x); (i) < (n); (i)++)
  29. #define _CRT_SECURE_NO_WARNING
  30. const ll MOD = 1000000007;
  31.  
  32. void Bustany() {
  33. ios_base::sync_with_stdio(false);
  34. cin.tie(NULL);
  35. cout.tie(NULL);
  36. #ifndef ONLINE_JUDGE
  37. freopen("./in.txt", "r", stdin), freopen("./out.txt", "w", stdout);
  38. #endif
  39. }
  40.  
  41. //vector<sll> adj(N);
  42. vector<vector<char>> adj;
  43. vector<vector<ll>> vis;
  44.  
  45. ll n, m, d;
  46. ll dx[] = {0, 0, 1, -1};
  47. ll dy[] = {1, -1, 0, 0};
  48.  
  49.  
  50. void solve() {
  51. cin >> n >> m >> d;
  52. vis.assign(n, vll(m, -1));
  53. adj.assign(n, vector<char>(m));
  54. for (ll i = 0; i < n; i++) {
  55. for (ll j = 0; j < m; j++) {
  56. cin >> adj[i][j];
  57. }
  58. }
  59. priority_queue<tuple<ll, ll, ll>,vector<tuple<ll,ll,ll>>,greater<tuple<ll,ll,ll>>> pq;
  60. for (ll i = 0; i < n; i++) {
  61. for (ll j = 0; j < m; j++) {
  62. if (adj[i][j] == 'M') {
  63. pq.push({0, i, j});
  64. vis[i][j] = 0;
  65. }
  66. }
  67. }
  68. while (!pq.empty()) {
  69. auto [di, x, y] = pq.top();
  70. pq.pop();
  71. if (di != vis[x][y])continue;
  72. if(di==d)continue;
  73. for (ll k = 0; k < 4; k++) {
  74. ll nx = dx[k] + x, ny = dy[k] + y;
  75. if (nx >= n || nx < 0 || ny >= m || ny < 0)continue;
  76. if (vis[nx][ny] == -1 || vis[nx][ny] > di + 1) {
  77. vis[nx][ny] = di + 1;
  78. pq.push({di + 1, nx, ny});
  79. }
  80. }
  81. }
  82. for (ll i = 0; i < n; i++) {
  83. for (ll j = 0; j < m; j++) {
  84. if (adj[i][j] == 'S') {
  85. priority_queue<tuple<ll, ll, ll>,vector<tuple<ll,ll,ll>>,greater<tuple<ll,ll,ll>>> q;
  86. _2vll dist(n, vll(m, LONG_LONG_MAX));
  87. dist[i][j] = 0;
  88. if (vis[i][j] == -1)
  89. q.push({0, i, j});
  90. while (!q.empty()) {
  91. auto [di, x, y] = q.top();
  92. q.pop();
  93. if (di != dist[x][y])continue;
  94. if (adj[x][y] == 'F') {
  95. cout << di << endl;
  96. return;
  97. }
  98. fr0(k, 4) {
  99. ll nx = dx[k] + x, ny = dy[k] + y;
  100. if (nx >= n || nx < 0 || ny >= m || ny < 0 || vis[nx][ny] != -1)continue;
  101. if (dist[nx][ny] > di + 1) {
  102. dist[nx][ny] = di + 1;
  103. q.push({di + 1, nx, ny});
  104. }
  105. }
  106. }
  107. cout << -1 << endl;
  108. }
  109. }
  110. }
  111.  
  112. }
  113.  
  114. int main() {
  115. Bustany();
  116. ll t = 1;
  117. // cin >> t;
  118. while (t--) {
  119. solve();
  120. }
  121. }
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
Standard output is empty