Pagini recente » Cod sursa (job #3224932) | Cod sursa (job #488404) | Cod sursa (job #1719068) | Cod sursa (job #2340315) | Cod sursa (job #2552346)
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
int di[4] = {0, 1, 0, -1};
int dj[4] = {1, 0, -1, 0};
int map[10005][10005];
int xi, yi, xf, yf, st, dr, mij, ans;
int a[10005][10005], b[10005][10005], r, c;
char ch;
pair<int, int> q[70000];
queue < pair<int, int> > coada;
void reset()
{
for(int i = 1; i <= r; i++)
for(int j = 1; j <= c; j++)
a[i][j] = b[i][j];
}
void bordare()
{
for(int i = 0; i <= r + 1; i++)
map[i][0] = map[i][r + 1] = -1;
for(int i = 0; i <= c + 1; i++)
map[0][i] = map[c + 1][i] = -1;
}
void lee()
{
int i, j, iurm, jurm;
while(!coada.empty())
{
i = coada.front().first;
j = coada.front().second;
coada.pop();
for(int directie = 0; directie < 4; directie++)
{
iurm = i + di[directie];
jurm = j + dj[directie];
if(!map[iurm][jurm])
{
map[iurm][jurm] = map[i][j] + 1;
coada.push(make_pair(iurm, jurm));
}
}
}
}
int fill(int x, int y, int d)
{
int iurm, jurm;
a[x][y] = -1;
for(int directie = 0; directie < 4; directie++)
{
iurm = x + di[directie];
jurm = y + dj[directie];
if(!a[iurm][jurm] && map[iurm][jurm] - 1 >= d)
fill(iurm, jurm, d);
}
}
int main()
{
cin >> r >> c;
for(int i = 1; i <= r; i++)
for(int j = 1; j <= c; j++)
{
cin >> ch;
if(ch == 'D')
{
coada.push(make_pair(i, j));
map[i][j] = 1;
}
else if(ch == '*')
map[i][j] = a[i][j] = b[i][j] = -1;
else if(ch == 'I')
{
xi = i;
yi = j;
}
else if(ch == 'O')
{
xf = i;
yf = j;
}
}
bordare();
lee();
//
// for(int i = 1; i <= r; i++)
// for(int j = 1; j <= c; j++)
// if(map[i][j] > 0)
// map[i][j] - 1;
st = 0;
dr = r + c;
ans = 0;
int ok = 0;
while(st <= dr)
{
mij = (st + dr) / 2;
reset();
fill(xi, yi, mij);
if(a[xf][yf] == 0 || map[xi][yi] <= mij)
dr = mij - 1;
else
{
ok = 1;
ans = mij;
st = mij + 1;
}
}
if(ok)
cout << ans << "\n";
else cout << -1 << "\n";
return 0;
}