Guest User

Untitled

a guest
Jun 24th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.92 KB | None | 0 0
  1. [20:22:29] We.Pepsi.Infi: #include <iostream>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string>
  5. #include <string.h>
  6. #include <map>
  7. #include <set>
  8. #include <vector>
  9. #include <memory.h>
  10. #include <math.h>
  11. #include <queue>
  12. #include <stack>
  13. #include <algorithm>
  14.  
  15. #define INF (10000000)
  16. #define PI (acos(-1))
  17. #define EPS (1e-8)
  18.  
  19. #define pb push_back
  20. #define mp make_pair
  21. #define li long long
  22.  
  23. using namespace std;
  24. struct Point{
  25.     int x;
  26.     int y;
  27. };
  28. int n,m;
  29. char g[1502][1502];
  30. bool mark[1502][1502];
  31. int dx[4] = { 1, 0, -1, 0 };
  32. int dy[4] = { 0, 1, 0, -1 };
  33. int dist[1502][1502];
  34. queue<Point> q;
  35. int parent[1502 * 1502];
  36. int rank[1502*1502];
  37. Point a, b;
  38. void make_set (int v) {
  39.  parent[v] = v;
  40.  rank[v] = 0;
  41. }
  42.  
  43. int find_set (int v) {
  44.  if (v == parent[v])
  45.   return v;
  46.  return parent[v] = find_set (parent[v]);
  47. }
  48. void union_sets (int a, int b) {
  49.  a = find_set (a);
  50.  b = find_set (b);
  51.  if (a != b) {
  52.   if (rank[a] < rank[b])
  53.    swap (a, b);
  54.   parent[b] = a;
  55.   if (rank[a] == rank[b])
  56.    ++rank[a];
  57.  }
  58. }
  59. void dfs(Point v) {
  60.   mark[v.x][v.y] = true;
  61.   if (g[v.x][v.y] == '.' || g[v.x][v.y] == 'L')
  62.   for (int i = 0; i < 4; ++i) {
  63.    if ((g[v.x + dx[i]][v.y + dy[i]] == '.' || g[v.x + dx[i]][v.y + dy[i]] == 'L') && !mark[v.x + dx[i]][v.y + dy[i]]) {
  64.     union_sets((v.x - 1) * m + v.y, (v.x - 1 + dx[i]) * m + v.y + dy[i]);
  65.     Point cur;
  66.     cur.x = v.x + dx[i];
  67.     cur.y = v.y + dy[i];
  68.     dfs(cur);
  69.    }
  70.   }
  71.  }
  72. void d(){
  73.     for (int i = 1; i <= n; i++)
  74.         for (int j = 1; j <= m; j++)
  75.             dist[i][j] = 10000000;
  76.     queue<Point> w;
  77.     while (!q.empty()){
  78.         Point cur = q.front();
  79.         w.push(cur);
  80.         dist[cur.x][cur.y] = 1;
  81.         q.pop();
  82.     }
  83.  while (w.size() > 0){
  84.         Point tmp = w.front();
  85.         w.pop();
  86.         for (int i = 0; i < 4; ++i) {
  87.     if (g[tmp.x + dx[i]][tmp.y + dy[i]] == 'X' && dist[tmp.x + dx[i]][tmp.y + dy[i]] > dist[tmp.x][tmp.y]){
  88.                     Point get;
  89.                     get.x = tmp.x + dx[i];
  90.                     get.y = tmp.y + dy[i];
  91.                     w.push(get);
  92.                     dist[tmp.x + dx[i]][tmp.y + dy[i]] = dist[tmp.x][tmp.y] + 1;
  93.     }
  94.     }
  95.  }
  96.     for (int i = 1; i <= n; ++i) {
  97.    for (int j = 1; j <= m; ++j)
  98.     if (dist[i][j] == 10000000)
  99.      dist[i][j] = 0;
  100.     }
  101. }
  102. bool used[1502][1502];
  103. void bfs() {
  104.   int cnt = 1;
  105.   Point lol = q.front();
  106.   used[lol.x][lol.y] = true;
  107.   while (!q.empty()) {
  108.    if (find_set((a.x - 1) * m + a.y) == find_set((b.x - 1) * m + b.y)) {
  109.     cout << cnt;
  110.     return;
  111.    }
  112.    Point tmp = q.front();
  113.    q.pop();
  114.    if (dist[tmp.x][tmp.y] > cnt) {
  115.     cnt++;
  116.    }
  117.    for (int i = 0; i < 4; ++i) {
  118.     if (dist[tmp.x + dx[i]][tmp.y + dy[i]] == dist[tmp.x][tmp.y] + 1 && !used[tmp.x + dx[i]][tmp.y + dy[i]]) {
  119.      Point cur;
  120.      cur.x = tmp.x + dx[i];
  121.      cur.y = tmp.y + dy[i];
  122.      q.push(cur);
  123.      used[tmp.x + dx[i]][tmp.y + dy[i]] = true;
  124.     }
  125.     if (g[tmp.x + dx[i]][tmp.y + dy[i]] == '.' || g[tmp.x + dx[i]][tmp.y + dy[i]] == 'L') {
  126.      union_sets((tmp.x + dx[i] - 1) * m + tmp.y + dy[i], (tmp.x - 1) * m + tmp.y);
  127.      used[tmp.x][tmp.y] = true;
  128.      g[tmp.x][tmp.y] = '.';
  129.     }
  130.    }
  131.   }
  132. }
  133. int main()
  134. {
  135.  freopen("input.txt","r",stdin);
  136.  freopen("output.txt","w",stdout);
  137.  cin >> n >> m;
  138.  for (int i = 0; i <= n + 1; i++)
  139.         for (int j = 0; j <= m  + 1; j++)
  140.             g[i][j] = ' ';
  141.     int cnt = 0;
  142.     for (int i = 1; i <= n; i++)
  143.         for (int j = 1; j <= m; j++){
  144.             cin >> g[i][j];
  145.             if (g[i][j] == 'L')
  146.                 if (cnt == 0){
  147.                     a.x = i;
  148.                     a.y = j;
  149.                     cnt++;
  150.                 }
  151.                 else{
  152.                     b.x = i;
  153.                     b.y = j;
  154.                 }
  155.         }
  156.     for (int i = 1; i <= n; i++){
  157.         for (int j = 1; j <= m; j++){
  158.             for (int k = 0; k < 4; k++)
  159.                 if ((g[i + dx[k]][j + dy[k]] == '.' || g[i + dx[k]][j + dy[k]] == 'L') && !mark[i + dx[k]][j + dy[k]] && g[i][j] == 'X') {
  160.       mark[i][j] = true;
  161.       Point cur;
  162.       cur.x = i;
  163.       cur.y = j;
  164.       q.push(cur);
  165.                 }
  166.         }
  167.     }
  168.     d();
  169.     for (int i = 1; i <= n; i++)
  170.         for (int j = 1; j <= m; j++)
  171.             mark[i][j] = false;
  172.     for (int i = 1; i <= n; ++i)
  173.    for (int j = 1; j <= m; ++j)
  174.     make_set((i - 1) * m + j);
  175.  for (int i = 1; i <= n; ++i) {
  176.    for (int j = 1; j <= m; ++j) {
  177.     if (!mark[i][j]) {
  178.         Point cur;
  179.         cur.x = i;
  180.         cur.y = j;
  181.      dfs(cur);
  182.     }
  183.    }
  184.     }
  185.     if (find_set((a.x - 1) * m + a.y) == find_set((b.x - 1) * m + b.y)) {
  186.    cout << 0;
  187.    return 0;
  188.   }
  189.     for (int i = 1; i <= n; i++)
  190.         for (int j = 1; j <= m; j++)
  191.             if (dist[i][j] == 1){
  192.                 Point get;
  193.                 get.x = i;
  194.                 get.y = j;
  195.                 q.push(get);
  196.             }
  197.     bfs();
  198. }
Add Comment
Please, Sign In to add comment