Pagini recente » Cod sursa (job #690557) | Cod sursa (job #303159) | Cod sursa (job #536813) | Cod sursa (job #3300497) | Cod sursa (job #639458)
Cod sursa(job #639458)
#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][5];
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][5];
int f[nmax][nmax];
int h[nmax][nmax];
int c[2200000][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]=-1;
}
}
}
void leeD()
{
int i,j,k=0,in,jn,d=1,p=1,l,ok;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(t[i][j][0]=='D')
{
g++;
c[g][0]=i;
c[g][1]=j;
c[g][2]=g;
}
}
}
d=g;
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&&(f[in][jn]==0))
{
f[in][jn]=f[i][j]+1;
d++;
c[d][0]=in;
c[d][1]=jn;
ok=1;
}
}
p++;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(t[i][j][0]=='D')
{
f[i][j]=0;
}
}
}
}
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();
leeD();
//gen2();
init();
leef();
//fout<<l1<<c1<<'\n';
fout<<h[l1][c1];
fin.close();
fout.close();
return 0;
}