Pagini recente » Cod sursa (job #2336287) | Cod sursa (job #2851578) | Cod sursa (job #2673929) | Cod sursa (job #3168002) | Cod sursa (job #2554005)
#include <fstream>
#include <deque>
#define K 1002
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,i,j,iv,jv,st,dr,mid,xs,xf,ys,yf,sol,d[K][K];
char a[K][K],f[K][K];
int di[]={0,1,0,-1};
int dj[]={1,0,-1,0};
deque <pair<int,int> > c;
int verif(int x){///verific daca exista drum cu toate celulele >= x
if(d[xs][ys]<=x)return 0;
while(!c.empty())
c.pop_back();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
f[i][j]=0;
c.push_back({xs,ys});
f[xs][ys]=1;
while(!c.empty()){
int i=c.front().first;
int j=c.front().second;
c.pop_front();
for(int dir=0;dir<4;dir++){
int iv=i+di[dir];
int jv=j+dj[dir];
if(!(iv && jv && iv<=n && jv<=m))continue;
if(a[iv][jv]=='*' || a[iv][jv]=='D')continue;
if(!f[iv][jv] && d[iv][jv]>x){
if(iv==xf && jv==yf)return 1;
c.push_back({iv,jv});
f[iv][jv]=1;
}
}
}
return 0;
}
int main(){
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
fin>>a[i][j];
if(a[i][j]=='I')
xs=i, ys=j;
if(a[i][j]=='O')
xf=i, yf=j;
if(a[i][j]=='D'){
c.push_back({i,j});
d[i][j] = 1;
}
}
while(!c.empty()){///calculez pt fiecare celula distanta pana la cel mai apropiat dragon
i=c.front().first;
j=c.front().second;
c.pop_front();
for(int dir=0;dir<4;dir++){
iv=i+di[dir];
jv=j+dj[dir];
if(!(iv && jv && iv<=n && jv<=m))continue;
if(a[iv][jv]=='*')continue;
if(d[iv][jv]==0){
d[iv][jv]=d[i][j]+1;
c.push_back({iv,jv});
}
}
}
st=1; dr=2005; sol=-1;
while(st<=dr){
mid=(st+dr)/2;
if(verif(mid))///exista drum cu distantele >= mid,deci caut o sol mai mare
st=mid+1,sol=mid;
else dr=mid-1;
}
if(sol>0)fout<<sol;
else fout<<-1;
return 0;
}