Pagini recente » Cod sursa (job #798847) | Cod sursa (job #2777607) | Cod sursa (job #984683) | Cod sursa (job #82922) | Cod sursa (job #974563)
Cod sursa(job #974563)
#include<fstream>
#include<queue>
#define N 1010
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int dx[]={0,1,-1,0,0};
int dy[]={0,0,0,1,-1};
queue<int> qx,qy;
int dr,st,e[N][N],i,j,n,m,mij,sol,xi,yi,D[N][N],xf,yf,yc,xc,x,y;
bool viz[N][N],c[N][N];
char ch;
void prec()
{
while(!qx.empty())
{
x=qx.front();y=qy.front();
qx.pop();qy.pop();
for(i=1;i<=4;++i)
{
xc=x+dx[i];
yc=y+dy[i];
if(xc<1||yc<1||xc>n||yc>m||e[xc][yc]||c[xc][yc])
continue;
e[xc][yc]=e[x][y]+1;
qx.push(xc); qy.push(yc);
}
}
}
int bfs()
{
qx.push(xi);
qy.push(yi);
D[xi][yi]=e[xi][yi];
while(!qx.empty())
{
x=qx.front();y=qy.front();
viz[x][y]=1;
qx.pop();qy.pop();
for(i=1;i<=4;++i)
{
xc=x+dx[i];
yc=y+dy[i];
if(xc<1||yc<1||xc>n||yc>m||c[xc][yc]||D[x][y]<D[xc][yc])
continue;
if(!D[xc][yc])
{
D[xc][yc]=min(D[x][y],e[xc][yc]);
qx.push(xc);
qy.push(yc);
continue;
}
if(D[x][y]<=e[xc][yc]&&D[x][y]>D[xc][yc])
D[xc][yc]=D[x][y];
else
continue;
qx.push(xc);
qy.push(yc);
}
}
if(D[xf][yf])
return D[xf][yf];
else
return -1;
}
int main()
{
f>>n>>m;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
{
f>>ch;
if(ch=='D')
{
qx.push(i);
qy.push(j);
c[i][j]=1;
}
else
if(ch=='I')
xi=i,yi=j;
else
if(ch=='O')
xf=i,yf=j;
else
if(ch=='*')
c[i][j]=1;
}
prec();
sol=bfs();
g<<sol;
return 0;
}