Alex_tz307

Labirint5

Oct 7th, 2021
1,242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.44 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define INF 0x3f3f3f3f
  3.  
  4. using namespace std;
  5.  
  6. ifstream fin("labirint.in");
  7. ofstream fout("labirint.out");
  8.  
  9. char a[1001][1001];
  10. int n, m, d1[1001][1001], d2[1001][1001], di[] = {-1, 0, 1, 0}, dj[] = {0, 1, 0, -1};
  11. /// d1[i][j] - lungimea minima a unui drum ce pleaca din pozitia (1, 1) si ajunge in pozitia (i, j)
  12. /// d2[i][j] - lungimea minima a unui drum ce pleaca din pozitia (N, M) si ajunge in pozitia (i, j)
  13.  
  14. struct pozitie {
  15.     int i, j;
  16. } q[1001 * 1001];
  17.  
  18. void Lee1() {
  19.     int st = 1, dr = 0;
  20.     pozitie aux;
  21.     aux.i = 1, aux.j = 1;
  22.     ++dr;
  23.     q[dr] = aux;
  24.     d1[1][1] = 1;
  25.     while (st <= dr) {
  26.         int i = q[st].i, j = q[st].j;
  27.         ++st;
  28.         for (int k = 0; k < 4; ++k) {
  29.             int iv = i + di[k], jv = j + dj[k];
  30.             if (1 <= iv && iv <= n && 1 <= jv && jv <= m) {
  31.                 if (d1[iv][jv] == INF) {
  32.                     d1[iv][jv] = d1[i][j] + 1;
  33.                     if (a[iv][jv] == '0') {
  34.                         aux.i = iv, aux.j = jv;
  35.                         q[++dr] = aux;
  36.                     }
  37.                 }
  38.             }
  39.         }
  40.     }
  41. }
  42.  
  43. void Lee2() {
  44.     int st = 1, dr = 0;
  45.     pozitie aux;
  46.     aux.i = n, aux.j = m;
  47.     ++dr;
  48.     q[dr] = aux;
  49.     d2[n][m] = 1;
  50.     while (st <= dr) {
  51.         int i = q[st].i, j = q[st].j;
  52.         ++st;
  53.         for (int k = 0; k < 4; ++k) {
  54.             int iv = i + di[k], jv = j + dj[k];
  55.             if (1 <= iv && iv <= n && 1 <= jv && jv <= m) {
  56.                 if (d2[iv][jv] == INF) {
  57.                     d2[iv][jv] = d2[i][j] + 1;
  58.                     if (a[iv][jv] == '0') {
  59.                         aux.i = iv, aux.j = jv;
  60.                         q[++dr] = aux;
  61.                     }
  62.                 }
  63.             }
  64.         }
  65.     }
  66. }
  67.  
  68. int main() {
  69.     fin >> n >> m;
  70.     for (int i = 1; i <= n; ++i) {
  71.         for (int j = 1; j <= m; ++j) {
  72.             fin >> a[i][j];
  73.             d1[i][j] = d2[i][j] = INF;
  74.         }
  75.     }
  76.     Lee1();
  77.     Lee2();
  78.     for (int i = 1; i <= n; ++i) {
  79.         for (int j = 1; j <= m; ++j) {
  80.             if (a[i][j] == '1') {
  81.                 if (d1[i][j] + d2[i][j] - 1 < d1[n][m]) {
  82.                     fout << '1';
  83.                 } else {
  84.                     fout << '0';
  85.                 }
  86.             } else {
  87.                 fout << '0';
  88.             }
  89.         }
  90.         fout << '\n';
  91.     }
  92.     fin.close();
  93.     fout.close();
  94.     return 0;
  95. }
  96.  
Advertisement
Add Comment
Please, Sign In to add comment