Pagini recente » Cod sursa (job #689473) | Cod sursa (job #2559105) | Cod sursa (job #410308) | Cod sursa (job #2463408) | Cod sursa (job #911227)
Cod sursa(job #911227)
#include <fstream>
#include <queue>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
const int MAX_N = 1005;
const int INF = (1 << 30);
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};
int n, m, pozl, pozc, D[MAX_N][MAX_N], rez[MAX_N][MAX_N];
char A[MAX_N][MAX_N];
queue < pair<int, int> > Q;
void read() {
string s;
f >> n >> m;
for (int i = 1; i <= n; i++) {
f >> s;
for (int j = 0; j < m; j++) {
A[i][j + 1] = s[j];
if (s[j] == 'D') {
Q.push (make_pair(i, j + 1));
D[i][j + 1] = 0;
} else if (s[j] == 'I') {
pozl = i;
pozc = j + 1;
}
}
}
}
void init() {
for (int i = 1; i <= 1000; i++)
for (int j = 1; j <= 1000; j++)
D[i][j] = INF;
}
int conditie(int linie, int coloana) {
if (linie >= 1 && linie <= n && coloana >= 1 && coloana <= m)
return 1;
return 0;
}
void lee() {
while (!Q.empty()) {
pair <int, int> X = Q.front(); Q.pop();
for (int k = 0; k < 4; k++) {
if (D[X.first][X.second] + 1 < D[X.first + dx[k]][X.second + dy[k]] && conditie(X.first + dx[k], X.second + dy[k])) {
D[X.first + dx[k]][X.second + dy[k]] = D[X.first][X.second] + 1;
Q.push (make_pair(X.first + dx[k], X.second + dy[k]));
}
}
}
}
void lee_sukar() {
rez[pozl][pozc] = D[pozl][pozc];
Q.push (make_pair(pozl, pozc));
while (!Q.empty()) {
pair <int, int> X = Q.front(); Q.pop();
for (int k = 0; k < 4; k++) {
if (rez[X.first + dx[k]][X.second + dy[k]] > rez[X.first][X.second]) {
rez[X.first + dx[k]][X.second + dy[k]] = rez[X.first][X.second];
Q.push (make_pair(X.first + dx[k], X.second + dy[k]));
}
}
}
}
void writeD() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)
g << D[i][j] << " ";
g << '\n';
}
}
void write_rez() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)
g << rez[i][j] << " ";
g << '\n';
}
}
int main() {
init();
read();
lee();
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
rez[i][j] = D[i][j];
lee_sukar();
writeD();
g << "\n\n\n";
write_rez();
f.close();
g.close();
return 0;
}