Pagini recente » Cod sursa (job #1444326) | Cod sursa (job #2579800) | Cod sursa (job #1976158) | Cod sursa (job #2832419) | Cod sursa (job #1637426)
#include <cstdio>
#include <queue>
#include <algorithm>
#define NMAX 1000
#define inf 1000005
using namespace std;
int n,m,i,j,l1,c1,l2,c2,daenerys[NMAX+5][NMAX+5],D[NMAX+5][NMAX+5];
char s[NMAX+5];
const int dx[4]= {0,0,1,-1};
const int dy[4]= {1,-1,0,0};
queue <pair <int,int> >q;
void lee1(int M[NMAX+5][NMAX+5])
{
int x,y,xx,yy;
while(!q.empty())
{
x=q.front().first;
y=q.front().second;
q.pop();
for(int k=0; k<4; ++k)
{
xx=x+dx[k];
yy=y+dy[k];
if(xx>0 && yy>0 && xx<=n && yy<=m)
if(M[xx][yy]!=-1 && M[x][y]+1<M[xx][yy])
{
M[xx][yy]=M[x][y]+1;
q.push(make_pair(xx,yy));
}
}
}
}
void lee2(int M[NMAX+5][NMAX+5])
{
int x,y,xx,yy;
M[l1][c1]=daenerys[l1][c1];
while(!q.empty())
{
x=q.front().first;
y=q.front().second;
q.pop();
for(int k=0; k<4; ++k)
{
xx=x+dx[k];
yy=y+dy[k];
if(xx>0 && yy>0 && xx<=n && yy<=m)
if(M[xx][yy]!=-1 && min(M[x][y],daenerys[xx][yy])>M[xx][yy])
{
M[xx][yy]=min(M[x][y],daenerys[xx][yy]);
q.push(make_pair(xx,yy));
}
}
}
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n",&n,&m);
for(i=1; i<=n; ++i)
{
gets(s+1);
for(j=1; j<=m; ++j)
{
if(s[j]=='.')
{
daenerys[i][j]=inf;
D[i][j]=0;
continue;
}
if(s[j]=='*')
{
daenerys[i][j]=-1;
D[i][j]=-1;
continue;
}
if(s[j]=='D')
{
D[i][j]=-1;
q.push(make_pair(i,j));
continue;
}
if(s[j]=='I')
{
daenerys[i][j]=inf;
l1=i;
c1=j;
continue;
}
daenerys[i][j]=inf;
l2=i;
c2=j;
}
}
lee1(daenerys);
q.push(make_pair(l1,c1));
lee2(D);
if(D[l2][c2]==0)
printf("-1\n");
else printf("%d\n",D[l2][c2]);
return 0;
}