Cod sursa(job #637807)
#include<fstream>
#include<string>
#define nmax 1002
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
char v[nmax][nmax],a[nmax][nmax];
int z[nmax][nmax][1000];
int n,m,i,j,x,y,g=0;
short dx[]={0,0,-1,1};
short dy[]={-1,1,0,0};
char t[nmax][nmax][1000];
int f[nmax][nmax];
int h[nmax][nmax];
int c[500000][3];
int l2,c2,l1,c1;
void citire()
{
fin>>n>>m;
for(i=1;i<=n;i++)
{
fin.get();
fin.get(v[i],nmax,'\n');
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
a[i][j]=v[i][j-1];
t[i][j][0]=a[i][j];
if(a[i][j]=='I')
{
l2=i;
c2=j;
}
if(a[i][j]=='O')
{
l1=i;
c1=j;
}
if(a[i][j]=='*')
{
f[i][j]=-2;
}
}
}
void gen(int g)
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
t[i][j][g]=t[i][j][0];
}
void leeD(int x,int y,int &g)
{
int i,j,k=0,in,jn,d=1,p=1;
g++;
gen(g);
c[1][0]=x;
c[1][1]=y;
while(p<=d)
{
i=c[p][0];
j=c[p][1];
for(k=0;k<4;k++)
{
in=i+dx[k];
jn=j+dy[k];
if(in>0&&jn>0&&in<=n&&jn<=m&&t[in][jn][g]!='*'&&(f[in][jn]==0||f[in][jn]>z[i][j][g]+1))
{
z[in][jn][g]=z[i][j][g]+1;
f[in][jn]=z[in][jn][g];
d++;
c[d][0]=in;
c[d][1]=jn;
t[in][jn][g]='*';
}
}
p++;
}
f[x][y]=0;
}
void gen2()
{
int i,j;
for(i=1;i<=n;i++)
for(j=2;j<=m;j++)
{
if(t[i][j][0]=='D')
leeD(i,j,g);
}
}
int mini(int x,int y)
{
if(x>y)
return y;
else
return x;
}
void init()
{
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
h[i][j]=-1;
}
void leef()
{
int i,j,in,jn,p=1,d=1,k,sum,sum1,min1=32000;
c[1][0]=l2;
c[1][1]=c2;
c[1][2]=f[l2][c2];
while(p<=d)
{
i=c[p][0];
j=c[p][1];
sum=c[p][2];
for(k=0;k<4;k++)
{
in=i+dx[k];
jn=j+dy[k];
if(in>0&&jn>0&&jn<=m&&in<=n&&t[in][jn][0]!='*')
{
sum1=mini(sum,f[in][jn]);
if(sum1>h[in][jn]||h[in][jn]==-1)
{
h[in][jn]=sum1;
d++;
c[d][0]=in;
c[d][1]=jn;
c[d][2]=sum1;
}
}
}
p++;
}
}
int main()
{
citire();
gen2();
init();
leef();
//fout<<l1<<c1<<'\n';
fout<<h[l1][c1];
fin.close();
fout.close();
return 0;
}