Advertisement
Guest User

Untitled

a guest
Nov 24th, 2016
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define loop(a, b) for(int a = 1;a <= b;a++)
  3. #define ff first
  4. #define ss second
  5.  
  6. using namespace std;
  7. typedef pair<pair<int, int> , int> pii;
  8. const int maxn = 309;
  9. bool vis[maxn][maxn][4];
  10. char a[maxn][maxn];
  11.  
  12. int dx[] = {1,-1,0,0};
  13. int dy[] = {0,0,1,-1};
  14.  
  15. bool valid(int R, int C, int i, int j){
  16.     if(i < 1 || i > R || j < 1 || j > C)
  17.         return false;
  18.     if(a[i][j] == '#')
  19.         return false;
  20.     return true;
  21. }
  22.  
  23. int main() {
  24.     freopen("input.txt", "r", stdin);
  25.     freopen("output.txt", "w", stdout);
  26.     int T;
  27.     cin >> T;
  28.     while(T--){
  29.         int R, C, ans = 0;
  30.         pair<int, int> s, e;
  31.         queue<pii> q;
  32.         cin >> R >> C;
  33.         loop(i, R)
  34.             loop(j, C){
  35.                 cin >> a[i][j];
  36.  
  37.         }
  38.         loop(i, R){
  39.             loop(j, C){
  40.                 if(a[i][j] == 'S')
  41.                     s.ff = i, s.ss = j;
  42.                 if(a[i][j] == 'E')
  43.                     e.ff = i, e.ss = j;
  44.             }
  45.         }
  46.         q.push({{s.ff, s.ss}, 1});
  47.         while(!q.empty() && !ans){
  48.             pii temp = q.front(); q.pop();
  49.             int x = temp.ff.ff;
  50.             int y = temp.ff.ss;
  51.             int m = temp.ss;
  52.             int mve = m % 3;
  53. //          printf("x == %d, y == %d, m == %d\n", x, y, m);
  54.             if(!mve) mve = 3;
  55.             if(vis[x][y][mve]) continue;
  56.             vis[x][y][mve] = true;
  57.             for(int i = 0;i < 4 && !ans;i++){
  58.                 bool ok = true;
  59.                 for(int j = 1;j <= mve && ok;j++){
  60.                     if(!valid(R, C, x + j * dx[i], y + j *dy[i]))
  61.                         ok = false;
  62.                 }
  63.                 if(ok){
  64.                     if(x + mve*dx[i] == e.ff && y + mve*dy[i] == e.ss){
  65.                         cout << m <<endl;
  66.                         ans=1;
  67.                     }
  68.                     else{
  69.                         q.push({{x + mve*dx[i], y + mve*dy[i]}, m+1});
  70.                     }
  71.                 }
  72.             }
  73.         }
  74.         if(!ans) cout << "NO" <<endl;
  75.         for(int i = 0;i < maxn;i++) for(int j = 0;j < maxn;j++) for(int  k = 0;k < 4;k++)
  76.             vis[i][j][k] = false;
  77.     }
  78.     return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement