Pagini recente » Cod sursa (job #3255632) | Cod sursa (job #2918165) | Cod sursa (job #820835) | Cod sursa (job #1384968) | Cod sursa (job #2953294)
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
int n,m,R[1001][1001],D[1001][1001],istart,jstart,ifinish,jfinish,sol,mx=0,r,l,mij;
char c;
queue<pair<int,int> >Q;
bool verificare_dragon(int i1, int j1)
{if (i1>=0 && j1>=0 && j1<m && i1<n && D[i1][j1]==-1) return true;
return false;
}
bool verificare_loc_sigur(int i1, int j1, int dep)
{if (i1>=0 && j1>=0 && j1<m && i1<n && R[i1][j1]==-1 && D[i1][j1]>=dep) return true;
return false;
}
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int main()
{cin>>n>>m;
for (int i=0;i<n;i++) for (int j=0;j<m;j++)
{cin>>c;
if (c=='I') istart=i,jstart=j;
if (c=='D') Q.push({i,j}),D[i][j]=0;
else D[i][j]=-1;
if (c=='*') R[i][j]=-2,D[i][j]=-2;
if (c=='O') ifinish=i,jfinish=j;
}
while (Q.size())
{int i=Q.front().first,j=Q.front().second;
for (int k=0;k<=3;k++)
{if (verificare_dragon(i+dx[k],j+dy[k]))
{Q.push({i+dx[k], j+dy[k]});
D[i+dx[k]][j+dy[k]]=D[i][j] + 1;
mx=max(mx,D[i+dx[k]][j+dy[k]]);
}
}
Q.pop();
}
r=mx+1;
while (r-l>1)
{mij=(r+l)/2;
for (int i=0;i<n;i++) for (int j=0;j<m;j++) if (R[i][j]!=-2) R[i][j]=-1;
Q.push({istart,jstart});
R[istart][jstart]=0;
while (Q.size())
{int i=Q.front().first,j=Q.front().second;
for (int k=0;k<=3;k++)
{if (verificare_loc_sigur(i+dx[k],j+dy[k],mij))
{Q.push({i+dx[k],j+dy[k]});
R[i+dx[k]][j+dy[k]]=R[i][j]+1;
}
}
Q.pop();
}
if (R[ifinish][jfinish]!=-1)
{sol=max(sol,mij);
l=mij;
}
else r=mij;
}
if (D[istart][jstart]<sol) sol=D[istart][jstart];
if (sol!=0) cout<<sol;
else cout<<-1;
return 0;
}