Pagini recente » Cod sursa (job #2425915) | Cod sursa (job #2197120) | Cod sursa (job #824887) | Cod sursa (job #2607615) | Cod sursa (job #1026471)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int m[1010][1010],v[1010][1010], r, c, dmax, ok;
int xx[] ={ 0, 0, -1, 1}, yy[] = { -1, 1, 0, 0};
struct per{
int x, y, d;
per(){}
per(int a,int b,int c)
{
x = a;
y = b;
d = c;
}
};
per I, O;
queue<per> coada;
queue<per> coada2;
vector<per> lv[1000000];
void dist_min()
{
while(!coada.empty())
{
int x, y, d;
x = coada.front().x;
y = coada.front().y;
d = coada.front().d;
if( d == 0) m[x][y] = 0;
coada.pop();
if( d > dmax) dmax = d;
for( int i = 0; i < 4; i++)
if(m[ x + xx[i]][y + yy[i]] == 0)
{
coada.push( per( x + xx[i], y + yy[i], d + 1));
m[ x + xx[i]][ y + yy[i]] = d + 1;
}
}
}
void drum(int d)
{
while(!coada2.empty() && !ok)
{
int x, y;
x = coada2.front().x;
y = coada2.front().y;
coada2.pop();
for( int i = 0; i < 4 && !ok; i++)
if(!v[ x + xx[i]][ y + yy[i]] && m[ x + xx[i]][ y + yy[i]] >= 0)
{
v[ x + xx[i]][ y + yy[i]] = 1;
if(m[ x + xx[i]][ y + yy[i]] >= d)
coada2.push( per( x + xx[i], y + yy[i], 0));
else
lv[m[ x + xx[i]][ y + yy[i]]].push_back( per( x + xx[i], y + yy[i], 0));
}
else if( v[ x + xx[i]][ y + yy[i]] == 2)
{
fout<<d;
ok = 1;
}
}
if( !ok && d > 0)
{
int x, i;
x = lv[d - 1].size();
for( i = 0; i < x; i++)
coada2.push( lv[ d - 1][ i]);
drum( d - 1);
}
else if( !ok) fout<< -1;
}
int main()
{
int i, j;
fin>> r>> c;
char x;
for(i = 0; i <= c + 1; i++)
{
m[ 0][ i] = -1;
m[ r + 1][ i] = -1;
}
for(i = 1; i <= r; i++)
{
m[ i][ 0] = -1;
m[ i][ c + 1] = -1;
for( j = 1; j <= c; j++)
{
fin>>x;
m[i][j] = 0;
if( x == 'D')
{
m[i][j] = -2;
coada.push(per(i,j,0));
}
if( x == '*')
m[ i][ j] = -1;
if( x == 'I')
I = per( i, j, 0);
if( x == 'O')
O = per( i, j, 0);
}
}
dist_min();
v[ I.x][ I.y] = 1;
v[ O.x][ O.y] = 2;
coada2.push( I);
if( v[ I.x][ I.y] == 2) fout<< 0;
else drum( dmax);
return 0;
}