Pagini recente » Istoria paginii onis-2014/clasament/runda-2 | Cod sursa (job #1757640) | Cod sursa (job #351766) | Cod sursa (job #1287900) | Cod sursa (job #2919997)
#include <iostream>
#include <fstream>
#include <queue>
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];
bool g[1005][1005];
queue < pair < int, int > >q;
int di[]= {0,0,1,-1};
int dj[]= {1,-1,0,0};
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;
}
}
}
}
int check(int i,int j)
{
return(i>=1 && i<=r && j>=1 && j<=c && a[i][j]!='*' && a[i][j]!='D');
}
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 Fill(int i,int j,int mij)
{
g[i][j]=true;
if(i==fti && j==ftj)return;
if((check(i+1,j) && d[i+1][j]>=mij) && g[i+1][j]==0)
{
Fill(i+1,j,mij);
}
if((check(i-1,j) && d[i-1][j]>=mij) && g[i-1][j]==0)
{
Fill(i-1,j,mij);
}
if((check(i,j+1) && d[i][j+1]>=mij) && g[i][j+1]==0)
{
Fill(i,j+1,mij);
}
if((check(i,j-1) && d[i][j-1]>=mij) && g[i][j-1]==0)
{
Fill(i,j-1,mij);
}
}
void dist()
{
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
if(a[i][j]=='D')
{
q.push(make_pair(i,j));
}
}
}
lee();
}
void reset()
{
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
g[i][j]=0;
}
}
}
void solve()
{
sol=-1;
int st=1;
int dr=maxim;
int mij=(dr+st)/2;
while(st<=dr)
{
mij=(st+dr)/2;
reset();
Fill(sti,stj,mij);
if(g[fti][ftj]==1)
{
st=mij+1;
sol=mij;
}
else
{
dr=mij-1;
}
}
fout<<sol<<"\n";
}
int main()
{
read();
dist();
solve();
return 0;
}