Pagini recente » Cod sursa (job #891077) | Cod sursa (job #577627) | Cod sursa (job #3003628) | Cod sursa (job #2305927) | Cod sursa (job #2553888)
#include <fstream>
#define INF 1000000000
#define K 1002
#include <deque>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,i,j,iv,jv,xf,xs,yf,ys,st,dr,mid,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
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});
while(!c.empty()){
i=c.front().first;
j=c.front().second;
if(i==xf && j==yf)return 1;
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(!f[iv][jv] && d[iv][jv]>=x){
f[iv][jv]=1;
c.push_back({iv,jv});
}
}
}
return 0;
}
int main(){
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
fin>>a[i][j];
d[i][j]=INF;
if(a[i][j]=='I')
xs=i,ys=j;
if(a[i][j]=='C')
xf=i,yf=j;
if(a[i][j]=='D'){
d[i][j]=0;
c.push_back({i,j});
}
}
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]==INF){
d[iv][jv]=1+d[i][j];
c.push_back({iv,jv});
}
}
}
st=d[xs][ys]; dr=2000;
while(st<=dr){
mid=(st+dr)/2;
if(verif(mid)) ///exista drum cu distantele >= mid,deci caut o sol mai mare
st=mid+1;
else dr=mid-1;
}
fout<<dr;
return 0;
}