Pagini recente » Cod sursa (job #845010) | Cod sursa (job #917691) | Cod sursa (job #2630502) | Cod sursa (job #2209429) | Cod sursa (job #3260580)
#include <fstream>
#include <deque>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
deque<pair<int,int>> q;
deque<int> q1;
int n,m,startl,startc,sfarsitl,sfarsitc;
int dist[1001][1001];
int viz[1001][1001];
int ml[]={1,0,-1,0};
int mc[]={0,1,0,-1};
bool in(int l,int c){
return (l && c && l<=n && c<=m);
}
void curat(){
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
viz[i][j]=0;
}
}
}
bool vf(int a){
curat();
int l,c,l1,c1,i;
q.push_back({startl,startc});
viz[startl][startc]=1;
while(!q.empty()){
l=q.front().first;
c=q.front().second;
q.pop_front();
for(i=0;i<4;i++){
l1=l+ml[i];
c1=c+mc[i];
if(in(l1,c1) && !viz[l1][c1] && dist[l1][c1]!=-1 && dist[l1][c1]-1>=a){
viz[l1][c1]=1;
q.push_back({l1,c1});
}
}
}
return (viz[sfarsitl][sfarsitc]==1);
}
int main()
{
int i,j,l,c,l1,c1,st,dr,rasp,mij;
char ch;
cin>>n>>m;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
cin>>ch;
if(ch=='I'){
startl=i;startc=j;
}else if(ch=='*'){
dist[i][j]=-1;
}else if(ch=='D'){
q.push_back({i,j});dist[i][j]=1;
}else if(ch=='O'){
sfarsitl=i;sfarsitc=j;
}
}
}
while(!q.empty()){
l=q.front().first;
c=q.front().second;
q.pop_front();
for(i=0;i<4;i++){
l1=l+ml[i];
c1=c+mc[i];
if(in(l1,c1) && dist[l1][c1]==0){
dist[l1][c1]=dist[l][c]+1;
q.push_back({l1,c1});
}
}
}
st=0;dr=1e6;rasp=-1;
while(st<=dr){
mij=(st+dr)/2;
if(dist[startl][startc]-1>=mij && vf(mij)){
rasp=mij;st=mij+1;
}else{
dr=mij-1;
}
}
cout<<rasp;
return 0;
}