Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2023
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.81 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2. using namespace std;
  3.  
  4. // clang-format off
  5. #define sim template < class c
  6. #define ris return * this
  7. #define dor > debug & operator <<
  8. #define eni(x) sim > typename \
  9.   enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
  10. sim > struct rge { c b, e; };
  11. sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
  12. sim > auto dud(c* x) -> decltype(cerr << *x, 0);
  13. sim > char dud(...);
  14. struct debug {
  15. #ifdef LOCAL
  16. ~debug() { cerr << endl; }
  17. eni(!=) cerr << boolalpha << i; ris; }
  18. eni(==) ris << range(begin(i), end(i)); }
  19. sim, class b dor(pair < b, c > d) {
  20.   ris << "(" << d.first << ", " << d.second << ")";
  21. }
  22. sim dor(rge<c> d) {
  23.   *this << "[";
  24.   for (auto it = d.b; it != d.e; ++it)
  25.     *this << ", " + 2 * (it == d.b) << *it;
  26.   ris << "]";
  27. }
  28. #else
  29. sim dor(const c&) { ris; }
  30. #endif
  31. };
  32. #define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
  33. // debug & operator << (debug & dd, P p) { dd << "(" << p.x << ", " << p.y << ")"; return dd; }
  34. // clang-format on
  35.  
  36. #define F  first
  37. #define S  second
  38. #define eb emplace_back
  39.  
  40. string read_string ( void ) {
  41.     static char ch[1000005];
  42.     scanf ( "%s", ch );
  43.     return string ( ch );
  44. }
  45.  
  46. using ll = long long int;
  47.  
  48. const vector<pair<int, int>> stps = {
  49.     { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
  50.  
  51. const int nax = 55;
  52. string s;
  53. int r, c, ans;
  54. int state[505][nax][nax];
  55. bool vis[505][nax][nax];
  56. pair<int, int> start, finish;
  57. vector<tuple<int, int, int>> q;
  58.  
  59. void calculate_flood ( void ) {
  60.     for ( int i = 1; i < 505; ++i ) {
  61.         for ( int j = 0; j < nax - 1; ++j ) {
  62.             for ( int k = 0; k < nax - 1; ++k ) {
  63.                 state[i][j][k] = state[i - 1][j][k];
  64.             }
  65.         }
  66.         for ( int j = 0; j < nax - 1; ++j ) {
  67.             for ( int k = 0; k < nax - 1; ++k ) {
  68.                 if ( state[i - 1][j][k] == 1 ) {
  69.                     for ( auto stp : stps ) {
  70.                         stp.F += j;
  71.                         stp.S += k;
  72.                         if ( stp.F < 0 || stp.S < 0 ) continue;
  73.                         if ( stp.F >= r || stp.S >= c ) continue;
  74.                         if ( stp == finish ) continue;
  75.                         if ( state[i][stp.F][stp.S] != 0 ) continue;
  76.                         state[i][stp.F][stp.S] = 1;
  77.                     }
  78.                 }
  79.             }
  80.         }
  81.     }
  82. }
  83.  
  84. void bfs ( void ) {
  85.     ans = -1;
  86.     q.eb ( start.F, start.S, 1 );
  87.     for ( int i = 0; i < int ( q.size () ); ++i ) {
  88.         tuple<int, int, int> cp = q[i];
  89.         if ( vis[get<2> ( cp )][get<0> ( cp )][get<1> ( cp )] ) continue;
  90.         vis[get<2> ( cp )][get<0> ( cp )][get<1> ( cp )] = true;
  91.         if ( finish.F == get<0> ( cp ) && finish.S == get<1> ( cp ) ) {
  92.             ans = get<2> ( cp );
  93.             break;
  94.         }
  95.         for ( auto stp : stps ) {
  96.             stp.F += get<0> ( cp );
  97.             stp.S += get<1> ( cp );
  98.             if ( stp.F < 0 || stp.S < 0 ) continue;
  99.             if ( stp.F >= r || stp.S >= c ) continue;
  100.             if ( !vis[get<2> ( cp )][stp.F][stp.S] &&
  101.                  state[get<2> ( cp )][stp.F][stp.S] == 0 )
  102.                 q.eb ( stp.F, stp.S, get<2> ( cp ) + 1 );
  103.         }
  104.     }
  105. }
  106.  
  107. int main ( void ) {
  108.     scanf ( "%d%d", &r, &c );
  109.     for ( int i = 0; i < r; ++i ) {
  110.         s = read_string ();
  111.         for ( int j = 0; j < c; ++j ) {
  112.             if ( s[j] == 'S' )
  113.                 start = { i, j };
  114.             else if ( s[j] == 'D' )
  115.                 finish = { i, j };
  116.             else if ( s[j] == 'X' )
  117.                 state[0][i][j] = -1;
  118.             else if ( s[j] == '*' )
  119.                 state[0][i][j] = 1;
  120.         }
  121.     }
  122.     calculate_flood ();
  123.     bfs ();
  124.     if ( ans == -1 ) {
  125.         puts ( "KAKTUS" );
  126.     } else {
  127.         printf ( "%d\n", ans - 1 );
  128.     }
  129.  
  130.     return 0;
  131. }
  132.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement