Pagini recente » Cod sursa (job #2858202) | Cod sursa (job #2664246) | Cod sursa (job #65583) | Cod sursa (job #338250) | Cod sursa (job #1082337)
#include<fstream>
#include<iostream>
using namespace std;
int dx[]= {0,0,-1,1};
int dy[]= {-1,1,0,0};
int r,c, var1, var2, f1, f2, coada1[1000000];
int coada2[1000000], cea=0, aqe=0, vec1[1000000], vec2[1000000];
char a;
int b[1000][1000], ok=0, d[1000][1000];
void sub()
{
int k, x, y, maxxx=-1;
while(cea<=aqe)
{
x=coada1[cea];
y=coada2[cea];
for( k = 0; k <= 3 ; k ++)
{
if((b[x+dx[k]][y+dy[k]]==0) && x+dx[k]<r && y+dy[k]<c && x+dx[k]>=0 &&y+dy[k]>=0)
{
if(b[x][y]==-2)
b[x+dx[k]][y+dy[k]]=1;
else
b[x+dx[k]][y+dy[k]]=b[x][y]+1;
coada1[aqe]=x+dx[k];
coada2[aqe]=y+dy[k];
aqe++;
}
}
cea++;
}
}
void Lee()
{
int k,x,y;
int prim, ultim;
prim=1000000;
ultim=1000001;
vec1[prim]=var1;
vec2[prim]=var2;
if(var1==f1 && var2==f2)
ok=1;
while(prim<=ultim)
{
x=vec1[prim];
y=vec2[prim];
prim++;
for(k=0; k <=3; k++)
{
if((d[x+dx[k]][y+dy[k]]==0)&& b[x+dx[k]][y+dy[k]]>0 && x+dx[k]<r && y+dy[k]<c && x+dx[k]>=0 &&y+dy[k]>=0)
{
if(x+dx[k]==f1 && y+dy[k]==f2)
ok=1;
if(b[x+dx[k]][y+dy[k]]>=d[x][y])
{
d[x+dx[k]][y+dy[k]]=d[x][y];
prim--;
vec1[prim]=x+dx[k];
vec2[prim]=y+dy[k];
}
else
{
d[x+dx[k]][y+dy[k]]=b[x+dx[k]][y+dy[k]];
vec1[ultim]=x+dx[k];
vec2[ultim]=y+dy[k];
ultim++;
}
}
}
}
}
int main()
{
ifstream f("barbar.in");
ofstream g("barbar.out");
int i, j;
f>>r>>c;
for(i = 0; i < r; i++)
for(j = 0; j < c; j ++)
{
f>>a;
if(a=='*')
b[i][j]=-1;
if(a=='.')
b[i][j]=0;
if(a=='D')
{
b[i][j]=-2;
coada1[aqe]=i;
coada2[aqe]=j;
aqe++;
}
if(a=='I')
var1=i, var2=j, b[i][j]=0;
if(a=='O')
f1=i, f2=j, b[i][j]=0;
}
sub();
for(i=0; i<r; i++)
for(j=0; j<c; j++)
d[i][j]=0;
d[var1][var2]=b[var1][var2];
Lee();
if(ok==1)
g<<d[f1][f2]<<endl;
else
g<<"-1"<<endl;
}