Pagini recente » Cod sursa (job #152197) | Cod sursa (job #2668965) | Cod sursa (job #2803719) | Cod sursa (job #393918) | Cod sursa (job #1464797)
#include <fstream>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
char c[1005][1005];
int a[1005][1005];
int b[1005][1005];
int dl[] = {-1, 0, 1, 0};
int dc[] = {0, 1, 0, -1};
int prim,ultim;
struct Poz{
int lin,col;
};
Poz Q[1000005];
int n,m;
int stx,sty,stopx,stopy;
inline void Citire()
{
f>>n>>m;
for(int i=1;i<=n;i++)
{
f>>(c[i]+1);
for(int j=1;j<=m;j++)
{
if(c[i][j]=='*')
{
a[i][j]=-1;
b[i][j]=-1;
}
else
if(c[i][j]=='I')
{
stx=i;
sty=j;
}
else
if(c[i][j]=='O')
{
stopx=i;
stopy=j;
}
else
if(c[i][j]=='D')
a[i][j]=-1;
}
}
}
inline void Bordare()
{
for(int i=1;i<=n;i++)
a[i][m+1]=a[i][0]=-1;
for(int i=1;i<=m;i++)
a[0][i]=a[n+1][i]=-1;
for(int i=1;i<=n;i++)
b[i][m+1]=b[i][0]=-1;
for(int i=1;i<=m;i++)
b[0][i]=b[n+1][i]=-1;
}
inline void Dragon()
{
ultim=0;
prim=1;
Poz pc,ps,p,v;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(c[i][j]=='D')
{
ps.lin=i;
ps.col=j;
Q[++ultim]=ps;
b[ps.lin][ps.col]=1;
}
while(prim<=ultim)
{
p=Q[prim];
prim++;
for(int i=0;i<4;i++)
{
v.lin=p.lin+dl[i];
v.col=p.col+dc[i];
if(b[v.lin][v.col]==0)
{
ultim++;
Q[ultim]=v;
b[v.lin][v.col]=b[p.lin][p.col]+1;
}
}
}
}
inline bool Lee(int dist)
{
int ret=0;
ultim=0;
prim=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(c[i][j]=='.' || c[i][j]=='I' || c[i][j]=='O')
{
a[i][j]=-1;
if(b[i][j]>=dist)
a[i][j]=0;
}
Poz ps,p,v;
ps.lin=stx;
ps.col=sty;
Q[++ultim]=ps;
if(a[ps.lin][ps.col]==-1)
return 0;
a[ps.lin][ps.col]=1;
while(prim<=ultim && a[stopx][stopy]==0)
{
p=Q[prim];
prim++;
for(int k=0;k<4;k++)
{
v.lin=p.lin+dl[k];
v.col=p.col+dc[k];
if(a[v.lin][v.col]==0)
{
Q[++ultim]=v;
a[v.lin][v.col]=a[p.lin][p.col]+1;
}
}
}
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
g<<a[i][j]<<" ";
g<<"\n";
}
g<<a[stopx][stopy]<<"\n";*/
if(a[stopx][stopy]>=1)
ret=1;
return ret;
}
inline void Rezolva(){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
b[i][j]--;
int sol=-1,st=1,dr=n+m;;
while(st<=dr)
{
int m=(st+dr)/2;
if(Lee(m))
{
sol=m;
st=m+1;
}
else
dr=m-1;
}
//g<<Lee(2)<<"\n";
g<<sol<<"\n";
}
int main()
{
Citire();
Bordare();
Dragon();
Rezolva();
return 0;
}