Cod sursa(job #2972511)

Utilizator dobreraduDobre Radu Fabian dobreradu Data 29 ianuarie 2023 16:55:45
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream in("labirint2.in");
ofstream out("labirint2.out");
const int DIRMAX = 4;
const int NMAX = 1002;
char ch;
int a[NMAX][NMAX];
int dist_start[NMAX][NMAX], dist_end[NMAX][NMAX];
int n, m, dl[4] = {1, -1, 0, 0}, dc[4] = {0, 0, 1, -1};

queue <pair<int, int> > q;
void bfs ( int lstart, int cstart ,int dist[NMAX][NMAX]) {

  q.push({lstart, cstart});
  dist[lstart][cstart] = 1;

  while (!q.empty()) {
    int lin = q.front().first;
    int col = q.front().second;
    q.pop();
    for (int dir = 0; dir < DIRMAX; ++dir) {
      if (!dist[lin + dl[dir]][col + dc[dir]] && !a[lin + dl[dir]][col + dc[dir]]) {
        dist[lin + dl[dir]][col + dc[dir]] = 1 + dist[lin][col];
        q.push({lin + dl[dir], col + dc[dir]});
      }
    }
  }
}
int main()
{
    int i, j;
    in >> n >> m;
    for (i = 0; i <= n + 1; ++i)
        for (j = 0; j <= m + 1; ++j)
          a[i][j] = -1;
    for (i = 1; i <= n; ++i)
        for (j = 1; j <= m; ++j)
            in >> ch, a[i][j] = ch - '0';
    dist_start[1][1] = dist_end[n][m] = 1;
    bfs(1, 1, dist_start);
    bfs(n, m, dist_end);
    for (i = 0; i <= 1 + n; ++i)
        for (j = 0; j <= 1 + m; ++j) {
          if (dist_start[i][j] == 0)
            dist_start[i][j] = (1 << 29);
          if (dist_end[i][j] == 0)
            dist_end[i][j] = (1 << 29);
        }
    int d0 = dist_start[n][m];
    for (i = 1; i <= n; ++i) {
        for (j = 1; j <= m; ++j) {
            if( a[i][j] == 1 ) {
                int min1 = (1 << 29);
                int min2 = (1 << 29);
                for (int dir = 0; dir < DIRMAX; ++dir) {
                    min1 = min(min1, dist_start[i + dl[dir]][j + dc[dir]]);
                    min2 = min(min2, dist_end[i + dl[dir]][j + dc[dir]]);
                }
                if (min1 + min2 + 1 < d0) out << "1";
                else out << "0";
            }
            else out << "0";
        }
        out << "\n";
    }
    return 0;
}