Pagini recente » Cod sursa (job #1125704) | Cod sursa (job #1351967) | Cod sursa (job #144572) | Cod sursa (job #434784) | Cod sursa (job #2817913)
#include <fstream>
#include <bitset>
#include <queue>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
const int DIM=1005;
int n,m,punctPlecareI=0,punctPlecareJ=0;
char ma[DIM][DIM]={0};
bitset<1> visited[DIM][DIM]={0};
queue<pair<int,int>> q;
int distDragon[DIM][DIM]={0};
void leeDistanteDragon(){
int dirI[4]={1,-1,0,0};
int dirJ[4]={0,0,1,-1};
int i1=0,j1=0;
while(!q.empty()){
i1=q.front().first;
j1=q.front().second;
q.pop();
int i=0,j=0;
for(int u=0;u<4;u++){
i=i1+dirI[u];
j=j1+dirJ[u];
if((i>0 && i<=n) && (j>0 && j<=m) && visited[i][j]==0 and ma[i][j]!='*'){
//cout << "neighbor push " << i << " " << j << "\n";
q.push({i,j});
visited[i][j] =1;
distDragon[i][j]=distDragon[i1][j1]+1;
}
}
}
}
bool isDistanceValid(int dist){
int dirI[4]={1,-1,0,0};
int dirJ[4]={0,0,1,-1};
while(!q.empty()){
q.pop();
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
visited[i][j]=0;
}
}
if(distDragon[punctPlecareI][punctPlecareJ]<dist)
return false;
q.push({punctPlecareI,punctPlecareJ});
visited[punctPlecareI][punctPlecareJ]=1;
int i=0,j=0;
while(!q.empty()){
i=q.front().first;
j=q.front().second;
//cout<<"am dat pop I:"<<i<<" j:"<<j<<" distanta:"<<dist<<'\n';
q.pop();
if(ma[i][j]=='O'){
return true;
}
int i1=0,j1=0;
for(int u=0;u<4;u++){
i1=i+dirI[u];
j1=j+dirJ[u];
if((i1>0 && i1<=n) && (j1>0 && j1<=m) && visited[i1][j1]==0 && distDragon[i1][j1]>=dist && ma[i1][j1]!='D' && ma[i1][j1]!='*'){
//cout<<"i:"<<i1<<" j:"<<j1<<'\n';
visited[i1][j1]=1;
q.push({i1,j1});
}
}
}
return false;
}
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>ma[i][j];
if(ma[i][j]=='D'){
//cout << "start push " << i << " " << j << "\n";
q.push({i,j});
visited[i][j]=1;
}
if(ma[i][j]=='I'){
punctPlecareI=i;
punctPlecareJ=j;
}
}
}
leeDistanteDragon();
int l=1,r=n*m,mid=0,ans=-1;
while(l<=r){
mid=l+(r-l)/2;
if(isDistanceValid(mid)==true){
ans=max(mid,ans);
l=mid+1;
}
else{
r=mid-1;
}
}
cout<<ans;
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<distDragon[i][j]<<" ";
}
cout<<'\n';
}*/
return 0;
}