Pagini recente » Cod sursa (job #2827692) | Cod sursa (job #1351393) | Cod sursa (job #1786378) | Cod sursa (job #2660692) | Cod sursa (job #2920011)
#include <iostream>
#include <fstream>
#include <queue>
#include <bitset>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int r,c,maxim,sti,stj,fti,ftj,sol;
char a[1005][1005];
int d[1005][1005];
bitset <1005> g[1005];
queue < pair < int, int > > Q;
int di[]= {0,0,1,-1};
int dj[]= {1,-1,0,0};
inline void read()
{
fin>>r>>c;
for(int i=1; i<=r; i++)
{
fin>>(a[i]+1);
for(int j=1; j<=c; j++)
{
if(a[i][j]=='I')
{
sti=i;
stj=j;
}
if(a[i][j]=='O')
{
fti=i;
ftj=j;
}
if(a[i][j] == 'D')
{
Q.push(make_pair(i,j));
}
}
}
}
inline bool check(int i,int j)
{
return(i>=1 && i<=r && j>=1 && j<=c && a[i][j]!='*' && a[i][j]!='D');
}
inline bool Fill(int mij)
{
if(d[sti][stj] < mij) return false;
while(!Q.empty()) Q.pop();
Q.push(make_pair(sti,stj));
g[sti][stj] = true;
while(!Q.empty())
{
int i = Q.front().first;
int j = Q.front().second;
if(i == fti && j == ftj) return true;
Q.pop();
for(int dir = 0; dir < 4; dir++)
{
int inext = i + di[dir];
int jnext = j + dj[dir];
if(check(inext,jnext) && d[inext][jnext] >= mij && !g[inext][jnext])
{
g[inext][jnext] = true;
Q.push(make_pair(inext,jnext));
}
}
}
return g[fti][ftj];
}
inline void lee()
{
int i,j,inext,jnext;
while(!Q.empty())
{
i=Q.front().first;
j=Q.front().second;
Q.pop();
for(int dir=0; dir<4; dir++)
{
inext=i+di[dir];
jnext=j+dj[dir];
if(check(inext,jnext) && (d[inext][jnext]>d[i][j] || d[inext][jnext]==0))
{
d[inext][jnext]=d[i][j]+1;
maxim=max(maxim,d[inext][jnext]);
Q.push(make_pair(inext,jnext));
}
}
}
}
void solve()
{
sol=-1;
int st=1;
int dr=r;
while(st<=dr)
{
int mij=(st+dr)/2;
for(int i=1; i<=r; i++)
{
g[i].reset();
}
if(Fill(mij))
{
st=mij+1;
sol=mij;
}
else
{
dr=mij-1;
}
}
fout<<sol<<"\n";
}
int main()
{
read();
lee();
solve();
return 0;
}