Pagini recente » Cod sursa (job #2607217) | Cod sursa (job #3265298) | Cod sursa (job #2850884) | Cod sursa (job #2346204)
#include <fstream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
const int N=1005;
int v[N][N],r,c,sol=0;
pair<int,int> coada[N*N],coada2[N*N],start,fin;
int di[4]={1,0,-1,0};
int dj[4]={0,1,0,-1};
bool viz[N][N],d[N][N];
bool ok(int x, int y)
{
return(x>0 && y>0 && x<=r && y<=c);
}
int main()
{
char ch;
int st=1,dr=0;
in>>r>>c;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
{
in>>ch;
if(ch=='*')
v[i][j]=-1;
else if(ch=='D')
{
coada[++dr]=make_pair(i,j);
v[i][j]=-1;
}
else if(ch=='I')
{
start.first=i;
start.second=j;
}
else if(ch=='O')
{
fin.first=i;
fin.second=j;
}
}
pair<int,int>p;
while(st<=dr)
{
p=coada[st];
for(int i=0;i<4;i++)
if(ok(p.first+di[i],p.second+dj[i]) && v[p.first+di[i]][p.second+dj[i]]==0 && !d[p.first+di[i]][p.second+dj[i]])
{
v[p.first+di[i]][p.second+dj[i]]=1+v[p.first][p.second];
coada[++dr]=make_pair(p.first+di[i],p.second+dj[i]);
d[p.first+di[i]][p.second+dj[i]]=true;
}
st++;
}
/*for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
out<<v[i][j]<<' ';
out<<'\n';
}*/
st=1;dr=0;
int st2=1,dr2=0;
coada[++dr]=start;
int best=v[start.first][start.second],x,y;
bool gasit=false;
while(best>=0 && !gasit)
{
for(int i=st2;i<=dr2;i++)
{
coada[++dr]=coada2[i];
viz[coada[dr].first][coada[dr].second]=true;
}
while(st<=dr)
{
p=coada[st];
if(p==fin)
{
gasit=true;
sol=best+1;
break;
}
for(int i=0;i<4;i++)
{
x=p.first+di[i];
y=p.second+dj[i];
if(!viz[x][y] && ok(x,y))
{
if(v[x][y]>=best)
{
coada[++dr]=make_pair(x,y);
viz[x][y]=true;
}
else if(v[p.first+di[i]][p.second+dj[i]]==best-1)
{
coada2[++dr2]=make_pair(x,y);
}
}
}
st++;
}
best--;
}
if(sol<1)
{
out<<-1;
return 0;
}
out<<sol;
return 0;
}