Pagini recente » Cod sursa (job #2974073) | Cod sursa (job #357222) | Cod sursa (job #1702678) | Cod sursa (job #1498270) | Cod sursa (job #2972511)
#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;
}