Pagini recente » Cod sursa (job #2617578) | Cod sursa (job #1826726) | Cod sursa (job #2661184) | Cod sursa (job #2511760) | Cod sursa (job #2033254)
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string.h>
#define Nmax 1005
#define INF (1<<30)
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int d[Nmax][Nmax],inq[Nmax][Nmax],ans,n,m,iin,jin,ifin,jfin,ls,ld,dd[Nmax][Nmax];
pair<int,int>p;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
char a[Nmax][Nmax];
queue<pair<int,int> >q;
int ins(int i, int j)
{
if(i >= 1 && i <= n && j >= 1 && j <= m)return 1;
return 0;
}
void parc(int i, int j)
{
for(int r = 0 ; r <= 3; r++)
{
int ii = i + dx[r];
int jj = j + dy[r];
if(ins(ii, jj) && a[ii][jj] != '*')
{
if(d[ii][jj] > d[i][j] + 1)
{
d[ii][jj] = d[i][j] + 1;
ans = max(ans, d[ii][jj]);
q.push(make_pair(ii,jj));
}
}
}
}
void parcurgere(int i, int j,int x)
{
for(int r = 0 ; r <= 3; r++)
{
int ii = i + dx[r];
int jj = j + dy[r];
if(ins(ii, jj) && a[ii][jj] != '*')
{
if(dd[ii][jj] > dd[i][j] + 1 && d[ii][jj] >= x)//distanta din ii jj pana la cel mai apropiat dragon sa nu fie mai mica decat x
{
dd[ii][jj] = dd[i][j] + 1;
q.push(make_pair(ii,jj));
}
}
}
}
int verif(int x)
{
for(int i =1; i<= n; i++)for(int j = 1; j<= n; j++)dd[i][j] =INF;
dd[iin][jin] = 0;
if(d[iin][jin] < x)return 0;
q.push(make_pair(iin, jin));
while(!q.empty())
{
p = q.front();
parcurgere(p.first,p.second,x);
q.pop();
}
if(dd[ifin][jfin]!=INF)return 1;
return 0;
}
int main()
{
fin >> n >> m;
for(int i =1; i<= n; i++)for(int j = 1; j<= n; j++)d[i][j] =INF;//distantele pana la dragoni
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
fin >> a[i][j];
if(a[i][j] == 'D')
{
q.push(make_pair(i,j));
d[i][j] = 0;
}
if(a[i][j] == 'I')iin = i, jin = j;
if(a[i][j] == 'O')ifin = i, jfin = j;
}
while(!q.empty())
{
p = q.front();
q.pop();
parc(p.first,p.second);
}
ls = 0;
ld = max(n,m) + 1;
while(ls < ld)
{
int mij = (ls + ld)/2 + 1;
if(verif(mij))ls = mij;//fixez distanta minima pana la un dragon
else ld = mij - 1;
}
if(verif(ls))
fout << ls;
else fout << -1;
return 0;
}