Pagini recente » Cod sursa (job #163) | Cod sursa (job #2248285) | Cod sursa (job #2877410) | Cod sursa (job #3161123) | Cod sursa (job #2557737)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int nm=1001;
const int di[]={-1,0,1,0},
dj[]={0,1,0,-1};
int n,m;
int M[nm][nm],B[nm][nm],D[nm][nm];
int istart,jstart;
int istop,jstop;
char c;
int ans;
queue < pair< int, int> > Q;
void citire()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
fin>>c;
if(c=='*') M[i][j]=-1;
else if(c=='D') M[i][j]=-1,Q.push(make_pair(i,j));
else if(c=='I') istart=i,jstart=j;
else if(c=='O') istop=i,jstop=j;
}
}
bool ok(int i, int j)
{
if(i<1 || j<1 || i>n || j>m) return false;
if(M[i][j]==-1) return false;
return true;
}
void Lee()
{
while(!Q.empty())
{
int i=Q.front().first;
int j=Q.front().second;
Q.pop();
for(int d=0;d<4;d++)
{
int i_n=i+di[d];
int j_n=j+dj[d];
if(ok(i_n,j_n) && (B[i_n][j_n]>B[i][j]+1 || !B[i_n][j_n]))
{
B[i_n][j_n]=B[i][j]+1;
Q.push(make_pair(i_n,j_n));
}
}
}
}
int verif(int d)
{
while(!Q.empty())
Q.pop();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
D[i][j]=0;
D[istart][jstart]=1;
if(B[istart][jstart]>=d) Q.push(make_pair(istart,jstart));
else return 0;
while(!Q.empty())
{
int i=Q.front().first;
int j=Q.front().second;
Q.pop();
for(int dir=0;dir<4;dir++)
{
int i_n=i+di[dir];
int j_n=j+dj[dir];
if(ok(i_n,j_n) && B[i_n][j_n]>=d && (D[i_n][j_n]>D[i][j]+1 || D[i_n][j_n]==0))
{
if(i_n==istop && j_n==jstop) return 1;
D[i_n][j_n]=D[i][j]+1;
Q.push(make_pair(i_n,j_n));
}
}
}
return 0;
}
void CautBin(int st, int dr)
{
while(st <= dr)
{
int mij = (st + dr)/2;
if(verif(mij) == 1)
{
ans = mij;
st = mij + 1;
}
else dr = mij - 1;
}
}
int main()
{
citire();
Lee();
CautBin(0,n*m);
if(!ans) fout<<-1;
else fout<<ans;
}