Pagini recente » Cod sursa (job #2363475) | Cod sursa (job #1608333) | Cod sursa (job #135581) | Cod sursa (job #84934) | Cod sursa (job #1026407)
#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 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();
coada2.push(I);
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')
{
per aux;
aux.x = i;
aux.y = j;
aux.d = 0;
m[i][j] = -2;
coada.push(aux);
}
if( x == '*')
m[i][j] = -1;
if( x == 'I')
{
I.x = i;
I.y = j;
m[i][j] = -1;
}
if( x == 'O')
{
O.x = i;
O.y = j;
m[i][j] = -1;
}
}
}
dist_min();
v[O.x][O.y] = 2;
coada2.push( I);
drum( dmax);
return 0;
}