Pagini recente » Cod sursa (job #2317741) | Cod sursa (job #1898211) | Cod sursa (job #1596967) | Cod sursa (job #1502552) | Cod sursa (job #1603069)
#include <stdio.h>
#include <queue>
int dx[4] = {1,0,0,-1};
int dy[4] = {0,1,-1,0};
using std::queue;
using std::pair;
using std::make_pair;
queue < pair < int,int > > Q;
int n,m,dir;
int temnita[1000][1000];
int tf[1000][1000];
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
char s[1000];
int i,j,ic,jc,sol = 0;
pair <int,int> _start;
pair <int, int> _end;
int st = 0,dr = 0, mij;
scanf("%d %d",&n,&m);
for(i = 0; i < n; ++i)
{
scanf("%s",s);
for(j = 0; j < m; ++j)
{
if(s[j] == '*')
temnita[i][j] = -1;
else
if(s[j] == 'D')
Q.push(make_pair(i,j));
else
if(s[j] == 'I'){
temnita[i][j] = -2;
_start.first = i;
_start.second = j;
}
else
if(s[j] == 'O'){
_end.first = i;
_end.second = j;
}
}
}
while(!Q.empty())
{
i = Q.front().first;
j = Q.front().second;
Q.pop();
for(dir = 0; dir < 4; ++dir)
{
ic = i + dx[dir];
jc = j + dy[dir];
if(ic >= 0 && jc >= 0 && ic < n && jc < m)
if(temnita[ic][jc] == 0){
if(dr < temnita[i][j] + 1)
dr = temnita[i][j] + 1;
temnita[ic][jc] = temnita[i][j] + 1;
Q.push(make_pair(ic,jc));
}
}
}
sol = dr;
while(st <= dr)
{
Q.push(make_pair(_start.first,_start.second));
mij = (st + dr) / 2;
while(!Q.empty())
{
i = Q.front().first;
j = Q.front().second;
Q.pop();
for(dir = 0; dir < 4; ++dir)
{
ic = i + dx[dir];
jc = j + dy[dir];
if(ic >= 0 && jc >= 0 && ic < n && jc < m){
if(tf[ic][jc] == 0 && temnita[ic][jc] >= mij){
tf[ic][jc] = tf[i][j] + 1;
Q.push(make_pair(ic,jc));
}
}
}
}
if(tf[_end.first][_end.second] != 0)
{
sol = mij;
st = mij + 1;
}
else
dr = mij - 1;
for(i = 0; i < n; ++i)
for(j = 0; j < m; ++j)
tf[i][j] = 0;
}
if(sol == 0)
printf("-1\n");
else
printf("%d\n",sol);
return 0;
}