Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [20:22:29] We.Pepsi.Infi: #include <iostream>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string>
- #include <string.h>
- #include <map>
- #include <set>
- #include <vector>
- #include <memory.h>
- #include <math.h>
- #include <queue>
- #include <stack>
- #include <algorithm>
- #define INF (10000000)
- #define PI (acos(-1))
- #define EPS (1e-8)
- #define pb push_back
- #define mp make_pair
- #define li long long
- using namespace std;
- struct Point{
- int x;
- int y;
- };
- int n,m;
- char g[1502][1502];
- bool mark[1502][1502];
- int dx[4] = { 1, 0, -1, 0 };
- int dy[4] = { 0, 1, 0, -1 };
- int dist[1502][1502];
- queue<Point> q;
- int parent[1502 * 1502];
- int rank[1502*1502];
- Point a, b;
- void make_set (int v) {
- parent[v] = v;
- rank[v] = 0;
- }
- int find_set (int v) {
- if (v == parent[v])
- return v;
- return parent[v] = find_set (parent[v]);
- }
- void union_sets (int a, int b) {
- a = find_set (a);
- b = find_set (b);
- if (a != b) {
- if (rank[a] < rank[b])
- swap (a, b);
- parent[b] = a;
- if (rank[a] == rank[b])
- ++rank[a];
- }
- }
- void dfs(Point v) {
- mark[v.x][v.y] = true;
- if (g[v.x][v.y] == '.' || g[v.x][v.y] == 'L')
- for (int i = 0; i < 4; ++i) {
- 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]]) {
- union_sets((v.x - 1) * m + v.y, (v.x - 1 + dx[i]) * m + v.y + dy[i]);
- Point cur;
- cur.x = v.x + dx[i];
- cur.y = v.y + dy[i];
- dfs(cur);
- }
- }
- }
- void d(){
- for (int i = 1; i <= n; i++)
- for (int j = 1; j <= m; j++)
- dist[i][j] = 10000000;
- queue<Point> w;
- while (!q.empty()){
- Point cur = q.front();
- w.push(cur);
- dist[cur.x][cur.y] = 1;
- q.pop();
- }
- while (w.size() > 0){
- Point tmp = w.front();
- w.pop();
- for (int i = 0; i < 4; ++i) {
- 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]){
- Point get;
- get.x = tmp.x + dx[i];
- get.y = tmp.y + dy[i];
- w.push(get);
- dist[tmp.x + dx[i]][tmp.y + dy[i]] = dist[tmp.x][tmp.y] + 1;
- }
- }
- }
- for (int i = 1; i <= n; ++i) {
- for (int j = 1; j <= m; ++j)
- if (dist[i][j] == 10000000)
- dist[i][j] = 0;
- }
- }
- bool used[1502][1502];
- void bfs() {
- int cnt = 1;
- Point lol = q.front();
- used[lol.x][lol.y] = true;
- while (!q.empty()) {
- if (find_set((a.x - 1) * m + a.y) == find_set((b.x - 1) * m + b.y)) {
- cout << cnt;
- return;
- }
- Point tmp = q.front();
- q.pop();
- if (dist[tmp.x][tmp.y] > cnt) {
- cnt++;
- }
- for (int i = 0; i < 4; ++i) {
- 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]]) {
- Point cur;
- cur.x = tmp.x + dx[i];
- cur.y = tmp.y + dy[i];
- q.push(cur);
- used[tmp.x + dx[i]][tmp.y + dy[i]] = true;
- }
- if (g[tmp.x + dx[i]][tmp.y + dy[i]] == '.' || g[tmp.x + dx[i]][tmp.y + dy[i]] == 'L') {
- union_sets((tmp.x + dx[i] - 1) * m + tmp.y + dy[i], (tmp.x - 1) * m + tmp.y);
- used[tmp.x][tmp.y] = true;
- g[tmp.x][tmp.y] = '.';
- }
- }
- }
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- freopen("output.txt","w",stdout);
- cin >> n >> m;
- for (int i = 0; i <= n + 1; i++)
- for (int j = 0; j <= m + 1; j++)
- g[i][j] = ' ';
- int cnt = 0;
- for (int i = 1; i <= n; i++)
- for (int j = 1; j <= m; j++){
- cin >> g[i][j];
- if (g[i][j] == 'L')
- if (cnt == 0){
- a.x = i;
- a.y = j;
- cnt++;
- }
- else{
- b.x = i;
- b.y = j;
- }
- }
- for (int i = 1; i <= n; i++){
- for (int j = 1; j <= m; j++){
- for (int k = 0; k < 4; k++)
- 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') {
- mark[i][j] = true;
- Point cur;
- cur.x = i;
- cur.y = j;
- q.push(cur);
- }
- }
- }
- d();
- for (int i = 1; i <= n; i++)
- for (int j = 1; j <= m; j++)
- mark[i][j] = false;
- for (int i = 1; i <= n; ++i)
- for (int j = 1; j <= m; ++j)
- make_set((i - 1) * m + j);
- for (int i = 1; i <= n; ++i) {
- for (int j = 1; j <= m; ++j) {
- if (!mark[i][j]) {
- Point cur;
- cur.x = i;
- cur.y = j;
- dfs(cur);
- }
- }
- }
- if (find_set((a.x - 1) * m + a.y) == find_set((b.x - 1) * m + b.y)) {
- cout << 0;
- return 0;
- }
- for (int i = 1; i <= n; i++)
- for (int j = 1; j <= m; j++)
- if (dist[i][j] == 1){
- Point get;
- get.x = i;
- get.y = j;
- q.push(get);
- }
- bfs();
- }
Add Comment
Please, Sign In to add comment