Pagini recente » prosoft-2016/clasament/10 | Cod sursa (job #490058) | Cod sursa (job #2502740) | Cod sursa (job #869635) | Cod sursa (job #2297070)
#include <bits/stdc++.h>
using namespace std;
char mat[1005][1005];
int ars[1005][1005],dd[1005][1005];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
queue<pair<int,int> >q;
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int n,m,i,j,xi,yi,xf,yf,x,y,x1,y1,d;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
{
scanf("\n");
for(j=1;j<=m;++j)
{
scanf("%c",&mat[i][j]);
if(mat[i][j]=='I')
xi=i,yi=j;
if(mat[i][j]=='O')
xf=i,yf=j;
if(mat[i][j]=='D')
q.push(make_pair(i,j));
else
ars[i][j]=n*m+1;
}
}
for(i=0;i<=n+1;i++)
mat[i][0]=mat[i][m+1]='*';
for(j=0;j<=m+1;j++)
mat[0][j]=mat[n+1][j]=='*';
while(!q.empty())
{
x=q.front().first;
y=q.front().second;
for(i=0;i<4;++i)
{
x1=x+dx[i];y1=y+dy[i];
if(mat[x1][y1]!='*' && ars[x1][y1]>ars[x][y]+1)
{
ars[x1][y1]=ars[x][y]+1;
q.push(make_pair(x1,y1));
}
}
q.pop();
}
q.push(make_pair(xi,yi));
dd[xi][yi]=ars[xi][yi];
while(!q.empty())
{
x=q.front().first;
y=q.front().second;
for(i=0;i<4;++i)
{
x1=x+dx[i];y1=y+dy[i];
if(mat[x1][y1]!='*')
{
d=min(ars[x1][y1],dd[x][y]);
if(dd[x1][y1]<d)
{
dd[x1][y1]=d;
q.push(make_pair(x1,y1));
}
}
}
q.pop();
}
if(dd[xf][yf]==0)
printf("-1");
else
printf("%d",dd[xf][yf]);
return 0;
}