Pagini recente » Cod sursa (job #431588) | Cod sursa (job #2252074) | Cod sursa (job #1063613) | Cod sursa (job #680206) | Cod sursa (job #2112092)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int dl[]={-1,0,1,0};
const int dc[]={0,1,0,-1};
const int N=1002;
int d[N][N],b[N][N];
struct poz{
int l,c;
};
poz q[N*N];
int main()
{
int m,n,i,j,st,dr,vmin;
st=0; dr=-1;
poz barbar,iesire,x,y;
char t;
//citire
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
fin>>t;
if(t=='.')
{
d[i][j]=-1;
b[i][j]=-1;
}
else if(t=='*')
{
d[i][j]=-2;
b[i][j]=-2;
}
else if(t=='D')
{
b[i][j]=-2;
d[i][j]=1;
q[++dr]=(poz){i,j};
}
else if(t=='I')
{
barbar=(poz){i,j};
b[i][j]=1;
d[i][j]=-1;
}
else if(t=='O')
{
iesire=(poz){i,j};
d[i][j]=-1;
b[iesire.l][iesire.c]=-1;
}
}
//bordare
for(i=0;i<=n+1;i++)
b[i][0]=d[i][0]=b[i][m+1]=d[i][m+1]=-2;
for(j=0;j<=m+1;j++)
b[0][j]=d[0][j]=b[n+1][j]=d[n+1][j]=-2;
while(st<=dr)
{
x=q[st++];
for(i=0;i<4;i++){
y.l=x.l+dl[i];
y.c=x.c+dc[i];
if(d[y.l][y.c]==-1)
{
q[++dr]=y;
d[y.l][y.c]=1+d[x.l][x.c];
}
}
}
/*for(i=0;i<=n+1;i++)
{
for(j=0;j<=m+1;j++)
fout<<b[i][j]<<" ";
fout<<"\n";
}*/
st=0; dr=-1;
q[++dr]=barbar;
vmin=N;
while(st<=dr)
{
x=q[st++];
if(d[x.l][x.c]<=vmin)
vmin=d[x.l][x.c];
for(i=0;i<4;i++)
{
y.l=x.l+dl[i];
y.c=x.c+dc[i];
if(b[y.l][y.c]==-1)
{
q[++dr]=y;
b[y.l][y.c]=1+b[x.l][x.c];
}
}
}
/*for(i=0;i<=n+1;i++)
{
for(j=0;j<=m+1;j++)
fout<<d[i][j]<<" ";
fout<<"\n";
}
fout<<"\n";*/
if(b[iesire.l][iesire.c]==-1) fout<<"-1";
else fout<<vmin;
return 0;
}