Pagini recente » Cod sursa (job #2076649) | Cod sursa (job #200441) | Cod sursa (job #1767063) | Cod sursa (job #276092) | Cod sursa (job #1026432)
#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;
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())
{
per aux;
aux = coada.front();
coada.pop();
if( aux.d > dmax) dmax = aux.d;
if(m[aux.x - 1][aux.y] == 0)
{
per aux1;
aux1 = aux;
aux1.x -= 1;
aux1.d++;
coada.push(aux1);
m[aux1.x][aux1.y] = aux1.d;
}
if(m[aux.x + 1][aux.y] == 0)
{
per aux1;
aux1 = aux;
aux1.x += 1;
aux1.d++;
coada.push(aux1);
m[aux1.x][aux1.y] = aux1.d;
}
if(m[aux.x][aux.y - 1] == 0)
{
per aux1;
aux1 = aux;
aux1.y -= 1;
aux1.d++;
coada.push(aux1);
m[aux1.x][aux1.y] = aux1.d;
}
if(m[aux.x][aux.y + 1] == 0)
{
per aux1;
aux1 = aux;
aux1.y += 1;
aux1.d++;
coada.push(aux1);
m[aux1.x][aux1.y] = aux1.d;
}
}
}
void drum(int d)
{
while(!coada2.empty() && !ok)
{
per aux;
aux = coada2.front();
coada2.pop();
v[aux.x][aux.y] = 1;
if(!v[aux.x + 1][aux.y] && m[aux.x + 1][aux.y] > 0)
{
v[aux.x + 1][aux.y] = 1;
per aux1;
aux1 = aux;
aux1.x += 1;
if(m[aux.x + 1][aux.y] >= d )
coada2.push(aux1);
else
lv[m[aux.x + 1][aux.y]].push_back(aux1);
}
else if(v[aux.x + 1][aux.y] == 2)
{
fout<<d;
ok = 1;
}
if(!v[aux.x - 1][aux.y] && m[aux.x -1][aux.y] > 0)
{
v[aux.x - 1][aux.y] = 1;
per aux1;
aux1 = aux;
aux1.x -= 1;
if(m[aux.x - 1][aux.y] >= d )
coada2.push(aux1);
else
lv[m[aux.x - 1][aux.y]].push_back(aux1);
}
else if(v[aux.x - 1][aux.y] == 2)
{
fout<<d;
ok = 1;
}
if(!v[aux.x][aux.y - 1] && m[aux.x][aux.y - 1] > 0)
{
v[aux.x][aux.y - 1] = 1;
per aux1;
aux1 = aux;
aux1.y -= 1;
if(m[aux.x][aux.y -1] >= d )
coada2.push(aux1);
else
lv[m[aux.x ][aux.y -1]].push_back(aux1);
}
else if(v[aux.x][aux.y - 1] == 2)
{
fout<<d;
ok = 1;
}
if(!v[aux.x][aux.y + 1] && m[aux.x][aux.y + 1] > 0)
{
v[aux.x][aux.y + 1] = 1;
per aux1;
aux1 = aux;
aux1.y += 1;
if(m[aux.x][aux.y + 1] >= d )
coada2.push(aux1);
else
lv[m[aux.x ][aux.y + 1]].push_back(aux1);
}
else if(v[aux.x][aux.y + 1] == 2)
{
fout<<d;
ok = 1;
}
}
if( !ok)
{
int x, i;
x = lv[d - 1].size();
for( i = 0; i < x; i++)
coada2.push( lv[ d - 1][ i]);
if(d > 1)drum( d - 1);
else 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;
if( 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.x = i;
I.y = j;
m[ i][ j] = 0;
}
if( x == 'O')
{
O.x = i;
O.y = j;
m[ i][ j] = 0;
}
}
}
dist_min();
v[ O.x][ O.y] = 2;
coada2.push( I);
if( v[ I.x][ I.y] == 2) fout<< 0;
else drum( dmax);
return 0;
}