Pagini recente » Cod sursa (job #578190) | Cod sursa (job #2749778) | Cod sursa (job #2534635) | Cod sursa (job #1601457) | Cod sursa (job #1536180)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
char c;
int maxim,sol,log,poz,AUX[1001][1001],prim,ultim,n,m,A[1001][1001],lf,cf,li,ci,urml,urmc,dl[4]={-1,0,1,0},dc[4]={0,1,0,-1};
struct coada {int l,c;} V[1000001];
int main()
{
f>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
f>>c;
switch(c)
{
case '*' :
A[i][j]=-1;
break;
case 'O' :
A[i][j]=-2;
lf=i;
cf=j;
break;
case 'I' :
A[i][j]=-2;
li=i;
ci=j;
break;
case 'D' :
V[++ultim].l=i;
V[ultim].c=j;
break;
case '.' :
A[i][j]=-2;
break;
}
}
prim=1;
while(prim<=ultim)
{
for(int dr=0;dr<4;++dr)
{
urml=V[prim].l+dl[dr];
urmc=V[prim].c+dc[dr];
if(A[urml][urmc]==-2)
{
A[urml][urmc]=A[V[prim].l][V[prim].c]+1;
V[++ultim].l=urml;
V[ultim].c=urmc;
}
}
++prim;
}
/* for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
g<<A[i][j]<<' ';
g<<'\n';
}
*/
maxim=A[V[ultim].l][V[ultim].c];
sol=-1;
for(log=1;log<=maxim;log<<=1);
for(;log;log>>=1)
{
if(A[li][ci]>=poz+log)
{
prim=ultim=1;
V[prim].l=li;
V[prim].c=ci;
int w=1;
memset(AUX,0,(n+1)*(m+1));
AUX[li][ci]=1;
while(prim<=ultim&&w)
{
if(V[prim].l==lf&&V[prim].c==cf)
{
poz+=log;
sol=poz;
w=0;
}
else
{
for(int dr=0;dr<4;++dr)
{
if(V[prim].l+dl[dr]<=n&&V[prim].l+dl[dr]>=1&&V[prim].c+dc[dr]<=m&&V[prim].c+dc[dr]>=1)
{
urml=V[prim].l+dl[dr];
urmc=V[prim].c+dc[dr];
if((A[urml][urmc]!=-1)&&(A[urml][urmc]>=(poz+log))&&(!AUX[urml][urmc]))
{
V[++ultim].l=urml;
V[ultim].c=urmc;
AUX[urml][urmc]=1;
}
}
}
}
++prim;
}
}
}
g<<sol;
return 0;
}