Pagini recente » Cod sursa (job #716433) | Cod sursa (job #2948871) | Cod sursa (job #643030) | Cod sursa (job #1194046) | Cod sursa (job #1470776)
/*
code by purplecoder
*/
#include <bits/stdc++.h>
#define MAX 1010
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int r, c, mat[MAX][MAX], startx, starty, stopx, stopy, dd[MAX][MAX], viz[MAX][MAX];
pair < int, int> q[MAX*MAX];
int p=1, u;
int di[4] = {0, 1, 0, -1};
int dj[4] = {1, 0, -1, 0};
bool ok(int i, int j)
{
if(i > r or j > c or i < 1 or j < 1)
return false;
if(mat[i][j] == -1 or mat[i][j] == -2)
return false;
return true;
}
void lee_dd()
{
int i_urm, j_urm, i, j;
while(p <= u)
{
i = q[p].first;
j = q[p].second;
for(int d=0; d<4; ++d)
{
i_urm = i + di[d];
j_urm = j + dj[d];
if(ok(i_urm, j_urm) and dd[i_urm][j_urm] == 0)
{
dd[i_urm][j_urm] = dd[i][j] + 1;
u++;
q[u].first = i_urm;
q[u].second = j_urm;
}
}
p++;
}
}
int ddd;
void fil(int i, int j)
{
if(!(ok(i, j) and viz[i][j] == 0))
return ;
if (dd[i][j] < ddd)
return ;
viz[i][j] = 1;
fil(i, j+1);
fil(i, j-1);
fil(i+1, j);
fil(i-1, j);
}
bool bine(int d)
{
ddd = d;
memset(viz, 0, sizeof(viz));
fil(startx, starty);
return viz[stopx][stopy] == 1 ? 1 : 0;
}
int main()
{
fin>>r>>c;
for(int i=1; i<=r; ++i)
for(int j=1; j<=c; ++j)
{
char x;
fin>>x;
if(x == '*')
mat[i][j] = -1;
if(x == 'D')
{
mat[i][j] = -2;
u++;
q[u].first = i;
q[u].second = j;
}
if(x == 'I')
{
startx = i;
starty = j;
}
if(x == 'O')
{
stopx = i;
stopy = j;
}
}
lee_dd();
int sol = -1;
int st = 1, dr = r*c;
while(st<=dr)
{
int mij =( st + dr ) / 2;
if(bine(mij) == 1)
{
st = mij+1;
sol = mij;
}
else
dr = mij -1;
}
fout<<sol;
return 0;
}