SuitNdtie

Sewer

Apr 24th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.72 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<vector>
  3. #include<queue>
  4. using namespace std;
  5.  
  6. struct pos{
  7.     int I,J;
  8. };
  9.  
  10. struct edge{
  11.     pos now;
  12.     pos parent;
  13.     int pDist;
  14.     bool operator < (const edge& rhs)const
  15.     {
  16.         return pDist > rhs.pDist;
  17.     }
  18. };
  19.  
  20. bool InB(int I,int N)
  21. {
  22.     return (I >= 1 && I <= N);
  23. }
  24.  
  25. int main()
  26. {
  27.     int n,m;
  28.     scanf("%d %d",&n,&m);
  29.     vector<pos> adj[n+1][m+1];
  30.     for(int i = 1 ; i <= n ; i++){
  31.         for(int j = 1 ; j <= m ; j++){
  32.             char c;
  33.             scanf(" %c",&c);
  34.             if(c == 'B'){
  35.                 adj[i][j].push_back({i+1,j});
  36.                 adj[i][j].push_back({i,j+1});
  37.                 if(InB(i+1,n))adj[i+1][j].push_back({i,j});
  38.                 if(InB(j+1,m))adj[i][j+1].push_back({i,j});
  39.             }
  40.             else if(c == 'D'){
  41.                 adj[i][j].push_back({i+1,j});
  42.                 if(InB(i+1,n))adj[i+1][j].push_back({i,j});
  43.             }
  44.             else if(c == 'R'){
  45.                 adj[i][j].push_back({i,j+1});
  46.                 if(InB(j+1,m))adj[i][j+1].push_back({i,j});
  47.             }
  48.         }
  49.     }
  50.     priority_queue<edge> pq;
  51.     pq.push({{1,1},{0,0},1});
  52.     bool visited[n+1][m+1];for(int i = 0 ; i <= n ; i++)for(int j = 0 ; j <= m ;j ++)visited[i][j] = false;
  53.  
  54.     int ansDist = 2e9;
  55.     int ansI;
  56.     int ansJ;
  57.     while(!pq.empty()){
  58.         int uI = pq.top().now.I;
  59.         int uJ = pq.top().now.J;
  60.         int PuI = pq.top().parent.I;
  61.         int PuJ = pq.top().parent.J;
  62.         int uPd = pq.top().pDist;
  63.         pq.pop();
  64.         if(visited[uI][uJ]){
  65.             if(ansDist > uPd){
  66.                 ansDist = uPd;
  67.                 ansI = uI;
  68.                 ansJ = uJ;
  69.             }
  70.             continue;
  71.         }
  72.         visited[uI][uJ] = true;
  73.  
  74.         for(int i = 0 ; i < adj[uI][uJ].size();i++){
  75.             int vI = adj[uI][uJ][i].I;
  76.             int vJ = adj[uI][uJ][i].J;
  77.             if(InB(vI,n) && InB(vJ,m) && (vI != PuI || vJ != PuJ)/* && !visited[vI][vJ]*/){
  78.                 pq.push({{vI,vJ},{uI,uJ},uPd+1});
  79.             }
  80.         }
  81.     }
  82.     printf("%d\n%d %d",ansDist,ansI,ansJ);
  83.     return 0;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment