Pagini recente » Cod sursa (job #639760) | Cod sursa (job #307318) | Cod sursa (job #1092108) | Cod sursa (job #3189246) | Cod sursa (job #2361809)
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,a[1010][1010]={1000},istart,jstart,ifinal,jfinal,f[1010][1010],maxim,dragoni,nrd;
char x;
struct nod{
int x;
int y;
int d;
};
int di[4] = {0, 0, 1, -1};
int dj[4] = {1, -1, 0 ,0};
bool lee(int lim){
queue <nod> coada;
memset(f,0,sizeof f);
f[istart][jstart]=1;
coada.push({istart,jstart,0});
while(!coada.empty()){
nod curent=coada.front();
coada.pop();
int i=curent.x,j=curent.y;
if(i==ifinal&&j==jfinal){
return true;
}
for(int t=0;t<4;t++){
int i2=i+di[t];
int j2=j+dj[t];
if(i2>0&&i2<=n&&j2>0&&j2<=m&&a[i2][j2]!=-1&&f[i2][j2]==0&&a[i2][j2]!=-2&&a[i2][j2]>=lim){
f[i2][j2]=1;
coada.push({i2,j2,0});
}
}
}
return 0;
}
void leeDragoni(int si, int sj){
queue <nod> coada;
memset(f,0,sizeof f);
f[si][sj]=1;
coada.push({si,sj,0});
while(!coada.empty()){
nod curent=coada.front();
coada.pop();
int i=curent.x, j=curent.y, dist=curent.d;
if(a[i][j]==0)
a[i][j]=dist;
else
a[i][j]=min(dist,a[i][j]);
if(dragoni==nrd)
maxim=max(a[i][j],maxim);
for(int t=0;t<4;t++){
int i2=i+di[t];
int j2=j+dj[t];
if(i2>0&&i2<=n&&j2>0&&j2<=m&&a[i2][j2]!=-1&&f[i2][j2]==0&&a[i2][j2]!=-2){
f[i2][j2]=1;
coada.push({i2,j2,dist+1});
}
}
}
}
int main(){
fin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
fin>>x;
if(x=='D'){
a[i][j]=-2;
nrd++;
}
if(x=='.')
a[i][j]=0;
if(x=='*')
a[i][j]=-1;
if(x=='I'){
a[i][j]=0;
istart=i;
jstart=j;
}
if(x=='O'){
a[i][j]=0;
ifinal=i;
jfinal=j;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]==-2){
dragoni++;
leeDragoni(i,j);
}
/* for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}*/
int st=1,dr=maxim;
while(st<=dr){
int mid=(st+dr)/2;
if(lee(mid)){
st=mid+1;
// cout<<mid<<" "<<dr<<" "<<st<<endl;
}
else
dr=mid-1;
}
// cout<<lee(2);
fout<<dr;
return 0;
}