Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<vector>
- #include<queue>
- using namespace std;
- struct pos{
- int I,J;
- };
- struct edge{
- pos now;
- pos parent;
- int pDist;
- bool operator < (const edge& rhs)const
- {
- return pDist > rhs.pDist;
- }
- };
- bool InB(int I,int N)
- {
- return (I >= 1 && I <= N);
- }
- int main()
- {
- int n,m;
- scanf("%d %d",&n,&m);
- vector<pos> adj[n+1][m+1];
- for(int i = 1 ; i <= n ; i++){
- for(int j = 1 ; j <= m ; j++){
- char c;
- scanf(" %c",&c);
- if(c == 'B'){
- adj[i][j].push_back({i+1,j});
- adj[i][j].push_back({i,j+1});
- if(InB(i+1,n))adj[i+1][j].push_back({i,j});
- if(InB(j+1,m))adj[i][j+1].push_back({i,j});
- }
- else if(c == 'D'){
- adj[i][j].push_back({i+1,j});
- if(InB(i+1,n))adj[i+1][j].push_back({i,j});
- }
- else if(c == 'R'){
- adj[i][j].push_back({i,j+1});
- if(InB(j+1,m))adj[i][j+1].push_back({i,j});
- }
- }
- }
- priority_queue<edge> pq;
- pq.push({{1,1},{0,0},1});
- bool visited[n+1][m+1];for(int i = 0 ; i <= n ; i++)for(int j = 0 ; j <= m ;j ++)visited[i][j] = false;
- int ansDist = 2e9;
- int ansI;
- int ansJ;
- while(!pq.empty()){
- int uI = pq.top().now.I;
- int uJ = pq.top().now.J;
- int PuI = pq.top().parent.I;
- int PuJ = pq.top().parent.J;
- int uPd = pq.top().pDist;
- pq.pop();
- if(visited[uI][uJ]){
- if(ansDist > uPd){
- ansDist = uPd;
- ansI = uI;
- ansJ = uJ;
- }
- continue;
- }
- visited[uI][uJ] = true;
- for(int i = 0 ; i < adj[uI][uJ].size();i++){
- int vI = adj[uI][uJ][i].I;
- int vJ = adj[uI][uJ][i].J;
- if(InB(vI,n) && InB(vJ,m) && (vI != PuI || vJ != PuJ)/* && !visited[vI][vJ]*/){
- pq.push({{vI,vJ},{uI,uJ},uPd+1});
- }
- }
- }
- printf("%d\n%d %d",ansDist,ansI,ansJ);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment