Pagini recente » Cod sursa (job #2984893) | Cod sursa (job #2022733) | Cod sursa (job #1326702) | Cod sursa (job #740428) | Cod sursa (job #3184294)
#include <bits/stdc++.h>
using namespace std;
queue < pair<int, int> > q;
char a[1005][1005];
int L, C, b[1005][1005], xs, ys, xf, yf;
int viz[1005][1005];
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
void Citire()
{
int i;
ifstream fin("barbar.in");
fin >> L >> C;
for (i = 1; i <= L; i++)
for (int j = 1; j <= C; j++)
{
fin >> a[i][j];
if (a[i][j] == 'I') {xs = i; ys = j;a[i][j] = '.';}
else if (a[i][j] == 'O') {xf = i; yf = j;a[i][j] = '.';}
}
}
void Bordare()
{
int i;
for (i = 0; i <= C + 1; ++i)
a[0][i] = a[L + 1][i] = '*';
for (i = 0; i <= L + 1; ++i)
a[i][0] = a[i][C + 1] = '*';
}
void Init()
{
int i, j;
for (i = 1; i <= L; ++i)
for (j = 1; j <= C; ++j)
b[i][j] = 2000000;
}
void Lee()
{
int i, j, x, y, k;
for (i = 1; i <= L; ++i)
for (j = 1; j <= C; ++j)
if (a[i][j] == 'D')
{
b[i][j] = 0;
q.push(make_pair(i, j));
}
while (!q.empty())
{
x = q.front().first;
y = q.front().second;
q.pop();
for (k = 0; k < 4; ++k)
{
i = x + dx[k];
j = y + dy[k];
if (a[i][j] != '*' && b[i][j] > b[x][y] + 1)
{
b[i][j] = b[x][y] + 1;
q.push(make_pair(i, j));
}
}
}
}
void InitC()
{
int i, j;
for (i = 1; i <= L; ++i)
for (j = 1; j <= C; ++j)
viz[i][j] = 0;
}
void Fill(int i, int j, int D)
{
if (a[i][j] == '.' && viz[i][j] == 0 && b[i][j] >= D)
{
viz[i][j] = 1;
Fill(i + 1, j, D);
Fill(i - 1, j, D);
Fill(i, j + 1, D);
Fill(i, j - 1, D);
}
}
int CautBin()
{
int st, dr, m, sol;
st = 1; dr = min(L, C);
sol = -1;
while(st <= dr)
{
m = (st + dr) / 2;
InitC();
Fill(xs, ys, m);
if (viz[xf][yf] == 1)
{
sol = m;
st = m + 1;
}
else dr = m - 1;
}
return sol;
}
void Afisare()
{
int solutie;
solutie = CautBin();
ofstream fout("barbar.out");
fout << solutie << "\n";
fout.close();
}
int main()
{
Citire();
Bordare();
Init();
Lee();
Afisare();
return 0;
}