Pagini recente » Cod sursa (job #1341080) | Cod sursa (job #318188) | Cod sursa (job #1803495) | Cod sursa (job #601362) | Cod sursa (job #1827222)
#include <fstream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <climits>
#include <iostream>
using namespace std;
const int MAXN = 1005;
int n, m;
int v[MAXN][MAXN], a[MAXN][MAXN];
char s[MAXN];
int xi, yi, xf, yf;
vector<int> c[3];
int drx[4] = {-1, 0, 1, 0};
int dry[4] = {0, 1, 0, -1};
void border() {
for (int i = 0; i <= m + 1; i++) {
v[i][0] = -1;
v[i][n + 1] = -1;
}
for (int i = 0; i <= n + 1; i++) {
v[0][i] = -1;
v[m + 1][i] = -1;
}
}
int main() {
ifstream f("barbar.in");
ofstream g("barbar.out");
f >> m >> n;
for (int i = 1; i <= m; i++) {
f >> s;
for (int j = 0; j < n; j++) {
if (s[j] == '*') {
v[i][j + 1] = -1;
}
else if (s[j] == 'D') {
v[i][j + 1] = -1;
c[1].push_back(i);
c[2].push_back(j + 1);
}
else if (s[j] == 'I') {
xi = i;
yi = j + 1;
}
else if (s[j] == 'O') {
xf = i;
yf = j + 1;
}
}
}
border();
int ci = 0;
while (ci < c[1].size()) {
int x = c[1][ci];
int y = c[2][ci];
for (int k = 0; k < 4; ++k) {
int lin = x + drx[k];
int col = y + dry[k];
if (a[lin][col] == 0 && v[lin][col] != -1) {
a[lin][col] = a[x][y] + 1;
c[1].push_back(lin);
c[2].push_back(col);
}
}
ci++;
}
int st = 1;
int dr = MAXN +2;
int sol = -1;
while (st <= dr) {
int mid = (st + dr) / 2;
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (v[i][j] != -1) {
v[i][j] = 0;
}
}
}
if (a[xi][yi] >= mid) {
c[1].clear();
c[2].clear();
ci = 0;
c[1].push_back(xi);
c[2].push_back(yi);
v[xi][yi] = 1;
while (ci < c[1].size()) {
int x = c[1][ci];
int y = c[2][ci];
for (int k = 0; k < 4; k++) {
int lin = x + drx[k];
int col = y + dry[k];
if (v[lin][col] == 0 && (a[lin][col] >= mid || a[lin][col] == 0)) {
v[lin][col] = v[x][y] + 1;
c[1].push_back(lin);
c[2].push_back(col);
}
}
ci++;
}
}
if (v[xf][yf] > 0) {
sol = mid;
st = mid + 1;
}
else {
dr = mid - 1;
}
}
g << sol;
return 0;
}