Pagini recente » Cod sursa (job #2176201) | Cod sursa (job #1483872) | Cod sursa (job #721121) | Cod sursa (job #2978531) | Cod sursa (job #1668881)
#include <iostream>
#include<fstream>
#include<deque>
using namespace std;
deque<int> l,c;
int li,ci,lf,cf,i,j,n,m,a[1005][1005],b[1005][1005],x1,x2,y1,y2;
char car;
int main()
{
ifstream f("barbar.in");
ofstream g("barbar.out");
int d1[]={-1,0,1,0};
int d2[]={0,-1,0,1};
f>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{f>>car;
if(car=='D')
{
l.push_back(i);
c.push_back(j);
}
else
{
if(car=='*') {a[i][j]=-1;b[i][j]=-1;}
else if(car=='I') {x1=i;y1=j;}
else if(car=='O') {x2=i;y2=j;}
}
}
while(!l.empty())
{
li=l.front();
ci=c.front();
l.pop_front();
c.pop_front();
if(li!=0 && ci!=0 && li!=n+1 && ci!=m+1)
for(i=0;i<4;i++)
{
lf=li+d1[i];cf=ci+d2[i];
if(a[lf][cf]==0)
{
a[lf][cf]=a[li][ci]+1;
l.push_back(lf);
c.push_back(cf);
}
}
}
l.push_back(x1);
c.push_back(y1);
b[x1][y1]=a[x1][y1];
while(!l.empty())
{
li=l.front();
ci=c.front();
l.pop_front();
c.pop_front();
if(li!=0 && ci!=0 && li!=n+1 && ci!=m+1)
for(i=0;i<4;i++)
{
lf=li+d1[i];cf=ci+d2[i];
if(min(b[li][ci],a[lf][cf])>b[lf][cf])
{
l.push_back(lf);
c.push_back(cf);
b[lf][cf]=min(b[li][ci],a[lf][cf]);
}
}
}
if(b[x2][y2]!=0 &&b[x2][y2]!=-1) g<<b[x2][y2];
else g<<-1;
return 0;
}