Advertisement
ariful_lu

1377last

Nov 18th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.39 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define sc(N) scanf (" %d", &N)
  4. #define scc(N) scanf (" %c", &N)
  5. #define scs(N) scanf (" %s", N)
  6. #define For(i,N) for (int i = 0; i < N; i++)
  7. #define pb push_back
  8. #define mk make_pair
  9. #define pr pair<int,int>
  10. #define ff first
  11. #define ss second
  12. using namespace std;
  13.  
  14. const int N = 205;
  15. const int inf = 10000000;
  16. int dx4[]={0,0,-1,1}; int dy4[]={1,-1,0,0}; //4 direction
  17. bool vis[2][N][N];
  18. char str[N][N];
  19. int r, c;
  20. pr D, P;
  21. vector <pr> port;
  22. int check(pr T)
  23. {
  24.     int x = T.ff; int y = T.ss;
  25.     if(x < 0 || x >= r || y < 0 || y >= c) return 1;
  26.     if(str[x][y] == '#' || vis[0][x][y]) return 1;
  27.     return 0;
  28. }
  29. int bfs()
  30. {
  31.     queue<pair<pr, pr> >q;
  32.     q.push (mk(P, mk(0,0)));
  33.     memset(vis, 0, sizeof (vis));
  34.     vis[0][P.ff][P.ss] = 1;
  35.  
  36.     while(!q.empty())
  37.     {
  38.         pr u = q.front().ff;
  39.         int step = q.front().ss.ff;
  40.         int k = q.front().ss.ss;
  41.         q.pop();
  42.         if(u == D) return step;
  43.  
  44.         if(str[u.ff][u.ss] == '*') {
  45.             int flag=0;
  46.             For (i, port.size()) {
  47.                 pr v = port[i];
  48.                 if(v == u) { flag = 1; continue; }
  49.                 if(!vis[1][v.ff][v.ss]) {
  50.                     vis[1][v.ff][v.ss] = 1;
  51.                     q.push(mk(v, mk(step+1, 1)));
  52.                 }
  53.             }
  54.             if(flag) { port.clear(); port.pb (u); }
  55.             if(k == 0) continue;
  56.         }
  57.         For (i, 4) {
  58.             pr v;
  59.             v.ff = u.ff + dx4[i];
  60.             v.ss = u.ss + dy4[i];
  61.             if(check(v)) continue;
  62.             vis[0][v.ff][v.ss] = 1;
  63.             q.push(mk(v, mk(step+1, 0)));
  64.         }
  65.     }
  66.     return -1;
  67. }
  68. int main()
  69. {
  70.     //freopen ("in.txt", "r", stdin);
  71.     int tc, i, j;
  72.     int cs = 0;
  73.     sc (tc);
  74.     while(tc--)
  75.     {
  76.         port.clear();
  77.         sc (r); sc (c);
  78.         For (i, r)
  79.         For (j, c) {
  80.             scc (str[i][j]);
  81.             if(str[i][j]=='P') P = mk (i, j);
  82.             else if(str[i][j]=='D') D = mk (i, j);
  83.             else if(str[i][j]=='*') port.pb (mk(i, j));
  84.         }
  85. //        For (i, r) {
  86. //            For (j, c) {
  87. //                cout << str[i][j];
  88. //            } cout << endl;
  89. //        }
  90.         printf("Case %d: ", ++cs);
  91.         int ret = bfs ();
  92.         if(ret == -1) printf("impossible\n");
  93.         else printf ("%d\n", ret);
  94.     }
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement