Pagini recente » Cod sursa (job #754707) | Cod sursa (job #745115) | Cod sursa (job #662584) | Cod sursa (job #424812) | Cod sursa (job #1721248)
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
struct poz
{
int x,y;
} in,sf,aux;
queue <poz> q;
int ox[]={-1,0,1,0};
int oy[]={0,1,0,-1};
int mat[1005][1005],d[1005][1005];
bool inq[1005][1005];
char s[1005];
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int n,m,i,j,nr;
scanf("%d%d\n",&n,&m);
for(i=1;i<=n;i++)
{
gets(s);
for(j=0;j<m;j++)
{
if(s[j]=='I') in.x=i, in.y=j+1;
if(s[j]=='O') sf.x=i, sf.y=j+1;
if(s[j]=='D')
{
mat[i][j+1]=-1;
aux.x=i, aux.y=j+1;
q.push(aux);
}
if(s[j]=='*')
{
mat[i][j+1]=-1;
d[i][j+1]=-1;
}
}
}
for(i=0;i<=n+1;i++)
{
mat[i][0]=-1;
mat[i][m+1]=-1;
d[i][0]=-1;
d[i][m+1]=-1;
}
for(j=0;j<=m+1;j++)
{
mat[0][j]=-1;
mat[n+1][j]=-1;
d[0][j]=-1;
d[n+1][j]=-1;
}
while(!q.empty())
{
for(int k=0;k<4;k++)
{
aux.x=q.front().x+ox[k];
aux.y=q.front().y+oy[k];
if(d[aux.x][aux.y]==0)
{
d[aux.x][aux.y]=d[q.front().x][q.front().y]+1;
q.push(aux);
}
}
q.pop();
}
/*for(i=0;i<=n+1;i++)
{
for(j=0;j<=m+1;j++) printf("%d ",mat[i][j]);
printf("\n");
}*/
mat[in.x][in.y]=d[in.x][in.y];
q.push(in);
inq[in.x][in.y]=1;
while(!q.empty())
{
for(int k=0;k<4;k++)
{
aux.x=q.front().x+ox[k];
aux.y=q.front().y+oy[k];
nr=min(mat[q.front().x][q.front().y], d[aux.x][aux.y]);
if(mat[aux.x][aux.y]==-1) continue;
if(mat[aux.x][aux.y]==0)
{
mat[aux.x][aux.y]=nr;
q.push(aux);
inq[aux.x][aux.y]=1;
}
else
{
if(nr>mat[aux.x][aux.y])
{
mat[aux.x][aux.y]=nr;
if(inq[aux.x][aux.y]==0)
{
q.push(aux);
inq[aux.x][aux.y]=1;
}
}
}
}
inq[q.front().x][q.front().y]=0;
q.pop();
}
printf("%d\n",mat[sf.x][sf.y]);
return 0;
}