Cod sursa(job #43320)

Utilizator mihai0110Bivol Mihai mihai0110 Data 29 martie 2007 23:14:02
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<fstream.h>
ifstream f("barbar.in");
ofstream g("barbar.out");
long n,m,i,j,sx,sy,fx,fy,u,p,l,c,cx[350000],cy[350000],a[1001][1001],b[1001][1001];
char ch;
int main()
{
f>>m>>n;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
f>>ch;
a[i][j]=-1;
if(ch=='D')
{
u++;
cx[u]=i;
cy[u]=j;
a[i][j]=0;
}
else
if(ch=='*')
a[i][j]=-2;
else
if(ch=='I')
{
sx=i;
sy=j;
}
else
if(ch=='O')
{
fx=i;
fy=j;
}
}
p=1;
while(p<=u)
{
l=cx[p];
c=cy[p];
if(l-1>0&&a[l-1][c]!=-2&&(a[l-1][c]==-1||a[l][c]+1<a[l-1][c]))
{
a[l-1][c]=a[l][c]+1;
u++;
cx[u]=l-1;
cy[u]=c;
}
if(l+1<=m&&a[l+1][c]!=-2&&(a[l+1][c]==-1||a[l][c]+1<a[l+1][c]))
{
a[l+1][c]=a[l][c]+1;
u++;
cx[u]=l+1;
cy[u]=c;
}
if(c+1<=n&&a[l][c+1]!=-2&&(a[l][c+1]==-1||a[l][c]+1<a[l][c+1]))
{
a[l][c+1]=a[l][c]+1;
u++;
cx[u]=l;
cy[u]=c+1;
}
if(c-1>0&&a[l][c-1]!=-2&&(a[l][c-1]==-1||a[l][c]+1<a[l][c-1]))
{
a[l][c-1]=a[l][c]+1;
u++;
cx[u]=l;
cy[u]=c-1;
}
p++;
}
u=u;
for(i=1;i<=u;i++)
{
cx[i]=0;
cy[i]=0;
}
u=1;
p=1;
cx[1]=sx;
cy[1]=sy;
b[sx][sy]=a[sx][sy];
while(p<=u)
{
l=cx[p];
c=cy[p];
if(l-1>0&&a[l-1][c]!=-2&&(b[l-1][c]==0||b[l][c]>b[l-1][c]))
{
b[l-1][c]=b[l][c];
if(a[l-1][c]<b[l-1][c])
b[l-1][c]=a[l-1][c];
u++;
cx[u]=l-1;
cy[u]=c;
}
if(l+1<=m&&a[l+1][c]!=-2&&(b[l+1][c]==0||b[l][c]>b[l+1][c]))
{
b[l+1][c]=b[l][c];
if(a[l+1][c]<b[l+1][c])
b[l+1][c]=a[l+1][c];
u++;
cx[u]=l+1;
cy[u]=c;
}
if(c+1<=n&&a[l][c+1]!=-2&&(b[l][c+1]==0||b[l][c]>b[l][c+1]))
{
b[l][c+1]=b[l][c];
if(a[l][c+1]<b[l][c+1])
b[l][c+1]=a[l][c+1];
u++;
cx[u]=l;
cy[u]=c+1;
}
if(c-1>0&&a[l][c-1]!=-2&&(b[l][c-1]==0||b[l][c]>b[l][c-1]))
{
b[l][c-1]=b[l][c];
if(a[l][c-1]<b[l][c-1])
b[l][c-1]=a[l][c-1];
u++;
cx[u]=l;
cy[u]=c-1;
}
p++;
}
if(b[fx][fy]>0)
g<<b[fx][fy];
else
g<<"-1";
g<<'\n';
f.close();
g.close();
return 0;
}