Pagini recente » Cod sursa (job #1524673) | Cod sursa (job #1171303) | Cod sursa (job #2684006) | Cod sursa (job #1623904) | Cod sursa (job #3205993)
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
const int MAXN=1e3;
const int inf=1e6+1;
queue<pair<int,int>>q;
char mat[MAXN+1][MAXN+1];
int distanta_dragon[MAXN+1][MAXN+1];
bool folosit[MAXN+1][MAXN+1];
int x[4]={1,-1,0,0};
int y[4]={0,0,-1,1};
int main(){
int n,m;
cin>>n>>m;
pair<int,int>Barbar,Iesire;
string s;
for(int i=0;i<=n;i++){
getline(cin,s);
for(int j=0;j<s.size();j++){
mat[i][j+1]=s[j];
distanta_dragon[i][j+1]=inf;
if(s[j]=='D'){
distanta_dragon[i][j+1]=0;
q.push({i,j+1});
}else if(s[j]=='I'){
Barbar.first=i;
Barbar.second=j+1;
}else if(s[j]=='O'){
Iesire.first=i;
Iesire.second=j+1;
}
}
}
while(!q.empty()){
pair<int,int>poz=q.front();
q.pop();
for(int i=0;i<=3;i++){
int X=x[i]+poz.first;
int Y=y[i]+poz.second;
if(X<1 || X>n || Y<1 || Y>m || mat[X][Y]=='*' || mat[X][Y]=='D' || distanta_dragon[X][Y]!=inf){
continue;
}
distanta_dragon[X][Y]=distanta_dragon[poz.first][poz.second]+1;
q.push({X,Y});
}
}
int st=1;
int dr=distanta_dragon[Iesire.first][Iesire.second];
int rasp=-1;
while(st<=dr){
int mij=(st+dr)/2;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
folosit[i][j]=1;
}
}
folosit[Barbar.first][Barbar.second]=0;
q.push({Barbar.first,Barbar.second});
while(!q.empty()){
pair<int,int>poz=q.front();
q.pop();
for(int i=0;i<=3;i++){
int X=x[i]+poz.first;
int Y=y[i]+poz.second;
if(X<1 || X>n || Y<1 || Y>m || mat[X][Y]=='*' || mat[X][Y]=='D' || distanta_dragon[X][Y]<mij || !folosit[X][Y]){
continue;
}
folosit[X][Y]=0;
if(X==Iesire.first && Y==Iesire.second){
break;
}
q.push({X,Y});
}
if(!folosit[Iesire.first][Iesire.second]){
while(!q.empty()){
q.pop();
}
}
}
if(folosit[Iesire.first][Iesire.second]){
dr=mij-1;
}else{
rasp=max(rasp,mij);
st=mij+1;
}
}
cout<<rasp;
}