Advertisement
paulomiranda98

L. Lonely day

Nov 4th, 2020
1,106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAXN 2020
  3. #define F first
  4. #define S second
  5. using namespace std;
  6. typedef pair<char,int> pci;
  7.  
  8. char tab[MAXN][MAXN];
  9. vector<pci> grafo[MAXN*MAXN];
  10. int n, m;
  11.  
  12. void add_aresta(int al, int ac, int bl, int bc, char vai, char volta){
  13.     grafo[MAXN*al+ac].push_back(pci(vai, MAXN*bl+bc));
  14.     grafo[MAXN*bl+bc].push_back(pci(volta, MAXN*al+ac));
  15. }
  16.  
  17. int s, r;
  18. int dist[MAXN*MAXN];
  19.  
  20. void bfs(){
  21.    
  22.     queue<int> q;
  23.     q.push(r);
  24.     dist[r] = 1;
  25.    
  26.     while(!q.empty()){
  27.         int v = q.front();
  28.        
  29.         q.pop();
  30.        
  31.         //cout << v << endl;
  32.         for(pci edge : grafo[v]){
  33.             int u = edge.S;
  34.             if(dist[u] == 0){
  35.                 q.push(u);
  36.                 dist[u] = dist[v] + 1;
  37.             }
  38.         }
  39.     }
  40. }
  41.  
  42.  
  43.  
  44. void dfs(int v, vector<char> &caminho){
  45.     if(v == r) return;
  46.     if(dist[v] == 0) return;
  47.    
  48.     pci prox;
  49.     prox.S =  -1;
  50.    
  51.     for(pci edge : grafo[v]){
  52.         if( (prox.S == -1) or
  53.             (dist[edge.S] < dist[prox.S]) or
  54.             (dist[edge.S] == dist[prox.S] and edge.F < prox.F)
  55.            ){
  56.             prox = edge;
  57.         }
  58.     }
  59.    
  60.     caminho.push_back(prox.F);
  61.     dfs(prox.S, caminho);
  62. }
  63.  
  64. int main(){
  65.    
  66.     cin.tie(0);
  67.     cin.sync_with_stdio(0);
  68.    
  69.     cin >> n >> m;
  70.    
  71.     for(int i = 1; i <= n; i++){
  72.         cin >> (&tab[i][1]);
  73.     }
  74.    
  75.     for(int i = 1; i <= n; i++){
  76.         for(int j = 1; j <= m; j++){
  77.             if(tab[i][j] == 'S') s = i*MAXN + j;
  78.             if(tab[i][j] == 'E') r = i*MAXN + j;
  79.         }
  80.     }
  81.    
  82.     for(int i = 1; i <= n; i++){
  83.         int ant = -1;
  84.        
  85.         for(int j = 1; j <= m; j++){
  86.             if(tab[i][j] != 'X'){
  87.                 if(ant != -1){
  88.                     add_aresta(i,ant,i,j,'R','L');
  89.                 }
  90.                 ant = j;
  91.             }
  92.         }
  93.     }
  94.    
  95.     for(int j = 1; j <= m; j++){
  96.         int ant = -1;
  97.        
  98.         for(int i = 1; i <= n; i++){
  99.             if(tab[i][j] != 'X'){
  100.                 if(ant != -1){
  101.                     add_aresta(ant,j,i,j,'D','U');
  102.                 }
  103.                 ant = i;
  104.             }
  105.         }
  106.     }
  107.    
  108.    
  109.     bfs();
  110.    
  111.     vector<char> cam = {};
  112.     dfs(s, cam);
  113.    
  114.     if(cam.size() == 0){
  115.         cout << -1 << endl;
  116.     }else{
  117.         cout << cam.size() << endl;
  118.         for(char x : cam){
  119.             cout << x;
  120.         }
  121.         cout << endl;
  122.     }
  123.    
  124. }
  125.  
  126.  
  127.  
  128.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement