Advertisement
Josif_tepe

Untitled

Mar 18th, 2022
1,039
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <set>
  7. #include <cstring>
  8. using namespace std;
  9. int dist_S[1001][1001];
  10. int dist_E[1001][1001];
  11. char mat[1001][1001];
  12. bool visited[1001][1001];
  13.  
  14. int main() {
  15.     ios_base::sync_with_stdio(false);
  16.     int n,m;
  17.     cin >> n >> m;
  18.     for (int i = 0; i < n; i++) {
  19.         for (int j = 0; j < m; j++) {
  20.             cin >> mat[i][j];
  21.             dist_S[i][j] = -1;
  22.             dist_E[i][j] = -1;
  23.         }
  24.     }
  25.     memset(visited, false,sizeof visited);
  26.  
  27.     for (int i = 0; i < n; i++) {
  28.         for (int j = 0; j < m; j++) {
  29.             queue<int> q;
  30.             if(mat[i][j] == 'S'){
  31.                 q.push(i);
  32.                 q.push(j);
  33.                 q.push(0);
  34.                 visited[i][j] = true;
  35.                
  36.            
  37.             while(!q.empty()){
  38.                 int ci = q.front();
  39.                 q.pop();
  40.                 int cj =q.front();
  41.                 q.pop();
  42.                 int dist= q.front();
  43.                 q.pop();
  44.                 if(mat[ci][cj] == 'E') {
  45.                     cout << dist << endl;
  46.                     return 0;
  47.                 }
  48.                 if(ci-1>=0 &&  !visited[ci-1][cj]){
  49.  
  50.                     if(mat[ci-1][cj] == '#'){
  51.                         dist_S[ci - 1][cj] = (dist + 1);
  52.                        
  53.                     }
  54.                     else {
  55.                     visited[ci-1][cj] = true;
  56.                     q.push(ci-1);
  57.                     q.push(cj);
  58.                     q.push(dist +1);
  59.                     }
  60.                 }
  61.                 if(ci+1<n && !visited[ci+1][cj]){
  62.                     if(mat[ci+1][cj] == '#'){
  63.                         dist_S[ci + 1][cj] = (dist + 1);
  64.                        
  65.                     }
  66.                     else {
  67.                     visited[ci+1][cj] =true;
  68.                     q.push(ci+1);
  69.                     q.push(cj);
  70.                     q.push(dist +1);
  71.                     }
  72.                 }
  73.                 if(cj+1<m && !visited[ci][cj+1]){
  74.  
  75.                     if(mat[ci][cj+1] == '#'){
  76.                         dist_S[ci][cj + 1] = (dist + 1);
  77.                        
  78.                     }
  79.                     else {
  80.                     visited[ci][cj+1] =true;
  81.                     q.push(ci);
  82.                     q.push(cj+1);
  83.                     q.push(dist +1);
  84.                     }
  85.                 }
  86.                 if(cj-1>=0 && !visited[ci][cj-1]){
  87.  
  88.                     if(mat[ci][cj-1] == '#'){
  89.                         dist_S[ci][cj - 1] = (dist + 1);
  90.                        
  91.                     }
  92.                     else {
  93.                     visited[ci][cj-1] =true;
  94.                     q.push(ci);
  95.                     q.push(cj-1);
  96.                     q.push(dist +1);
  97.                     }
  98.                 }
  99.             }
  100.         }
  101.     }
  102.     }
  103.     memset(visited, false, sizeof visited);
  104.     for (int i = 0; i < n; i++) {
  105.         for (int j = 0; j < m; j++) {
  106.             queue<int> q;
  107.             if(mat[i][j] == 'E'){
  108.                 q.push(i);
  109.                 q.push(j);
  110.                 q.push(0);
  111.                 visited[i][j] = true;
  112.  
  113.            
  114.             while(!q.empty()){
  115.                 int ci = q.front();
  116.                 q.pop();
  117.                 int cj =q.front();
  118.                 q.pop();
  119.                 int dist= q.front();
  120.                 q.pop();
  121.                 if(ci-1>=0 &&  !visited[ci-1][cj]){
  122.  
  123.                     if(mat[ci-1][cj] == '#'){
  124.                         dist_E[ci - 1][cj] =(dist + 1);
  125.                        
  126.                     }
  127.                     else {
  128.                     visited[ci-1][cj] = true;
  129.                     q.push(ci-1);
  130.                     q.push(cj);
  131.                     q.push(dist +1);
  132.                     }
  133.                 }
  134.                 if(ci+1<n && !visited[ci+1][cj]){
  135.  
  136.                     if(mat[ci+1][cj] == '#'){
  137.                         dist_E[ci + 1][cj] = (dist + 1);
  138.                        
  139.                     }
  140.                     else {
  141.                     visited[ci+1][cj] =true;
  142.                     q.push(ci+1);
  143.                     q.push(cj);
  144.                     q.push(dist +1);
  145.                     }
  146.                 }
  147.                 if(cj+1<m && !visited[ci][cj+1]){
  148.  
  149.                     if(mat[ci][cj+1] == '#'){
  150.                         dist_E[ci][cj + 1] = (dist + 1);
  151.                        
  152.                     }
  153.                     else {
  154.                     visited[ci][cj+1] =true;
  155.                     q.push(ci);
  156.                     q.push(cj+1);
  157.                     q.push(dist +1);
  158.                     }
  159.                 }
  160.                 if(cj-1>=0 && !visited[ci][cj-1]){
  161.  
  162.                     if(mat[ci][cj-1] == '#'){
  163.                         dist_E[ci][cj - 1] = (dist + 1);
  164.                        
  165.                     }
  166.                     else {
  167.                     visited[ci][cj-1] =true;
  168.                     q.push(ci);
  169.                     q.push(cj-1);
  170.                     q.push(dist +1);
  171.                 }
  172.                 }
  173.             }
  174.         }
  175.     }
  176.     }
  177.     int result = -1;
  178.     for(int i =0 ; i < n; i++) {
  179.         for(int j=0 ; j < m; j++) {
  180.             if(mat[i][j] == '#') {
  181.                 if(dist_S[i][j] != -1 and dist_E[i][j] != -1) {
  182.                     result = max(result, dist_S[i][j] + dist_E[i][j]);
  183.                 }
  184.             }
  185.         }
  186.     }
  187.     cout << result << endl;
  188.     return 0;
  189. }
  190.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement