Pagini recente » Cod sursa (job #1650039) | Cod sursa (job #2215453) | Cod sursa (job #2312531) | Cod sursa (job #2596246) | Cod sursa (job #3229869)
#include <fstream>
#include <queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
const int nmax = 1001;
int nou[nmax][nmax];
struct dragonel
{
int lin,col;
};
queue<dragonel>dragoni;
queue<dragonel>q;
int verif[nmax][nmax];
int di[] = {-1, 0, 1, 0};
int dj[] = {0, 1, 0, -1};
int n,m;
dragonel inceput;
dragonel destinatie;
bool bariera(dragonel p)
{
int l = p.lin;
int c = p.col;
if(1 <= l && l <= n && 1 <= c && c <= m)
return true;
return false;
}
void lee()
{
while(!dragoni.empty())
{
dragonel curent;
curent.lin = dragoni.front().lin;
curent.col = dragoni.front().col;
dragoni.pop();
for(int k = 0; k <= 3; k++)
{
dragonel vecin;
vecin.lin = curent.lin + di[k];
vecin.col = curent.col + dj[k];
if(bariera(vecin) == true && nou[vecin.lin][vecin.col] == 0)
{
nou[vecin.lin][vecin.col] = nou[curent.lin][curent.col] + 1;
dragoni.push(vecin);
}
}
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
if(nou[i][j] == 0)
nou[i][j] = 1e9;
else
nou[i][j]--;//pt ca am inceput distantele de la dragoni de la 1 in loc de 0
}
}
bool exista_traseu(int dist)
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
if(nou[i][j] >= dist)///distanta cedl putin prag!!!
verif[i][j] = 0;
else
verif[i][j] = -1;
verif[inceput.lin][inceput.col] = 1;//!!!!! nu aduna nimic inainte
q.push(inceput);
while(!q.empty())
{
dragonel curent;
curent.lin = q.front().lin;
curent.col = q.front().col;
q.pop();
for(int k = 0; k <= 3; k++)
{
dragonel vecin;
vecin.lin = curent.lin + di[k];
vecin.col = curent.col + dj[k];
if(bariera(vecin) == true && verif[vecin.lin][vecin.col] == 0)
{
verif[vecin.lin][vecin.col] = verif[curent.lin][curent.col] + 1;
q.push(vecin);
}
}
}
if(verif[destinatie.lin][destinatie.col] > 0)
return true;
return false;
}
int cb(int st, int dr)
{
int traseu = -1;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(exista_traseu(mij) == true)
{
traseu = mij;
st = mij + 1;
}
else
dr = mij - 1;
}
return traseu;
}
int main()
{
in>>n>>m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
char x;
in>>x;
if(x == '.')
nou[i][j] = 0;
else if(x == '*')
nou[i][j] = -1;
else if(x == 'D')
{
nou[i][j] = 1; //-1 for all
dragonel dragon;
dragon.lin = i;
dragon.col = j;
dragoni.push(dragon);
}
else if(x == 'I')
{
inceput.lin = i;
inceput.col = j;
}
else if(x == 'O')
{
destinatie.lin = i;
destinatie.col = j;
}
}
lee();
out<<cb(1, n * m);
return 0;
}