Advertisement
add1ctus

Патот до дома

Jan 14th, 2017
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.24 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <queue>
  6.  
  7. using namespace std;
  8.  
  9. int n,m;
  10. char input[101][101]; // Графот како што го читаме на инпут
  11. int rooms[101][101]; // Означувам која координата на која просторија припаѓа
  12. int nextRoom = 1;
  13. int startRoom; // Во која просторија се наоѓа S
  14. int finishRoom; // Во која просторија се наоѓа H
  15.  
  16. // Наместо да пишувам 4 if-а за да иде dfs-то во 4 насоки, со ова се пишува помалку код
  17. int xd[] = {0, 0, -1, 1};
  18. int yd[] = {1, -1, 0, 0};
  19.  
  20. void ff(int x, int y, int room) // ff(x, y, room) ја поставува координатата x, y да припаѓа на просторијата room
  21. {
  22.     rooms[x][y] = room;
  23.     if(input[x][y] == 'S')
  24.         startRoom = room;
  25.     if(input[x][y] == 'H')
  26.         finishRoom = room;
  27.     for(int d = 0 ; d < 4 ; ++d)
  28.     {
  29.         if(x + xd[d] >= 0 && x + xd[d] < n && y + yd[d] >= 0 && y + yd[d] < m)
  30.         {
  31.             int xx = x + xd[d];
  32.             int yy = y + yd[d];
  33.             if(input[xx][yy] != '|' && input[xx][yy] != '-' && input[xx][yy] != 'F' && !rooms[xx][yy] && input[xx][yy] != '*')
  34.                 ff(xx, yy, room);
  35.         }
  36.     }
  37. }
  38.  
  39. vector<int> graph[10001];
  40.  
  41. int main()
  42. {
  43.     scanf("%d%d",&n,&m);
  44.     for(int i = 0 ; i < n ; ++i)
  45.         for(int j = 0 ; j < m ; ++j)
  46.             scanf(" %c", &input[i][j]);
  47.     // За сите координати што не се препрека / улица и немаат просторија, им поставува просторија и повикува flood fill
  48.     for(int i = 0 ; i < n ; ++i)
  49.         for(int j = 0 ; j < m ; ++j)
  50.             if(!rooms[i][j] && input[i][j] != '|' && input[i][j] != 'F' && input[i][j] != '-' && input[i][j] != '*')
  51.                 ff(i, j, nextRoom++);
  52.    
  53.     // Многу ружен код што наоѓа која просторија со која е поврзана и генерира граф како adjacency list
  54.     for(int i = 0 ; i < n ; ++i)
  55.         for(int j = 0 ; j < m ; ++j)
  56.         {
  57.             if(!rooms[i][j])
  58.                 continue;
  59.             for(int d = 0 ; d < 4 ; ++d)
  60.             {
  61.                 int dist = 1;
  62.                 int xx = i + xd[d]*dist;
  63.                 int yy = j + yd[d]*dist;
  64.                 while(xx >= 0 && xx < n && yy >= 0 && yy < m)
  65.                 {
  66.                     if(input[xx][yy] == '.' || input[xx][yy] == 'S' || input[xx][yy] == 'H')
  67.                     {
  68.                         if(rooms[xx][yy] != rooms[i][j])
  69.                             if(find(graph[rooms[xx][yy]].begin(), graph[rooms[xx][yy]].end(), rooms[i][j]) == graph[rooms[xx][yy]].end())
  70.                             {
  71.                                 graph[rooms[xx][yy]].push_back(rooms[i][j]);
  72.                                 graph[rooms[i][j]].push_back(rooms[xx][yy]);
  73.                             }
  74.                         break;
  75.                     }
  76.                     else if((input[xx][yy] == '|' && d <= 1) || (input[xx][yy] == '-' && d >= 2))
  77.                     {
  78.                         ++dist;
  79.                         xx = i + xd[d]*dist;
  80.                         yy = j + yd[d]*dist;
  81.                     }
  82.                     else
  83.                         break;
  84.                 }
  85.             }
  86.         }
  87.    
  88.     // Останува само обичен BFS за да се добие резултатот
  89.     queue<int> Q;
  90.     int dist[10001];
  91.     bool visited[10001];
  92.  
  93.     memset(dist, -1, sizeof(dist));
  94.     memset(visited, false, sizeof(visited));
  95.  
  96.     Q.push(startRoom);
  97.     visited[startRoom] = true;
  98.     dist[startRoom] = 0;
  99.  
  100.     while(!visited[finishRoom] && !Q.empty())
  101.     {
  102.         int curr = Q.front();
  103.         Q.pop();
  104.  
  105.         for(int i = 0 ; i < graph[curr].size() ; ++i)
  106.             if(!visited[graph[curr][i]])
  107.             {
  108.                 visited[graph[curr][i]] = true;
  109.                 dist[graph[curr][i]] = dist[curr] + 1;
  110.                 Q.push(graph[curr][i]);
  111.             }
  112.     }
  113.  
  114.     printf("%d", dist[finishRoom]);
  115.  
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement