Pagini recente » Cod sursa (job #2014085) | Autentificare | Cod sursa (job #1681189) | Cod sursa (job #43514) | Cod sursa (job #604016)
Cod sursa(job #604016)
#include <cstdio>
#include <queue>
using namespace std;
struct str
{
int x,y,d;
};
char ch[1024];
int v[1024][1024],u[1024][1024],a[2][4];
queue <str> d,q[2001];
inline int min(int a,int b)
{
if (a>b)
return b;
else
return a;
}
int main()
{
int n,m,i,j,x,y,z,t;
str aux,aux2;
aux.d=0;
a[0][0]=1;a[0][2]=-1;a[1][1]=1;a[1][3]=-1;
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d %d\n",&n,&m);
for (i=1;i<=n;++i)
for (j=1;j<=m;++j)
u[i][j]=-1;
for (i=1;i<=n;++i)
{
fgets(ch,1010,stdin);
for (j=1;j<=m;++j)
{
if (ch[j-1]=='.')
v[i][j]=-2;
else if (ch[j-1]=='*')
v[i][j]=-1;
else if (ch[j-1]=='D')
{
v[i][j]=0;
aux.x=i;
aux.y=j;
d.push(aux);
}
else if (ch[j-1]=='I')
{
v[i][j]=-2;
x=i;
y=j;
}
else
{
v[i][j]=-2;
z=i;
t=j;
}
}
}
while (!d.empty())
{
aux=d.front();
d.pop();
for (i=0;i<4;++i)
if (v[aux.x+a[0][i]][aux.y+a[1][i]]==-2)
{
v[aux.x+a[0][i]][aux.y+a[1][i]]=v[aux.x][aux.y]+1;
aux2.x=aux.x+a[0][i];
aux2.y=aux.y+a[1][i];
aux2.d=aux.d+1;
d.push(aux2);
}
}
u[x][y]=v[x][y];
aux.x=x;
aux.y=y;
aux.d=v[x][y];
for (q[aux.d].push(aux),i=v[x][y];i>=0;--i)
{
while (q[i].size())
{
aux=q[i].front();
q[i].pop();
for (j=0;j<4;++j)
if (v[aux.x+a[0][j]][aux.y+a[1][j]]>-1&&u[aux.x+a[0][j]][aux.y+a[1][j]]==-1)
{
aux2.x=aux.x+a[0][j];
aux2.y=aux.y+a[1][j];
aux2.d=min(i,v[aux.x+a[0][j]][aux.y+a[1][j]]);
u[aux2.x][aux2.y]=aux2.d;
q[aux2.d].push(aux2);
}
}
}
printf("%d\n",u[z][t]);
return 0;
}