Pagini recente » Cod sursa (job #774782) | Istoria paginii utilizator/arabtrappin | Cod sursa (job #2314109) | Cod sursa (job #1467057) | Cod sursa (job #953693)
Cod sursa(job #953693)
#include<fstream>
#include<queue>
#include<vector>
#define punct pair<int,int>
#define x first
#define INF 999999999
#define y second
#define mp make_pair
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int i,j,n,m,p,u,ok,xx,nxx,yy,nyy,dir;
int d[1010][1010],b[1010][1010];
bool a[1010][1010];
vector<punct>v;
punct q[1000100];
punct pi,pf;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
char s[1100];
inline bool ein(int x,int y)
{
if(x<0||y<0||x>n||y>n)
return 0;
return 1;
}
int main()
{
f>>n>>m;
for(i=1;i<=n;++i)
{
f>>(s+1);
for(j=1;j<=m;++j)
{
if(s[j]=='*')
a[i][j]=1;
if(s[j]=='I')
pi.x=i,pi.y=j;
if(s[j]=='O')
pf.x=i,pf.y=j;
if(s[j]=='D')
v.push_back(mp(i,j));
}
}
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
d[i][j]=INF;
for(vector<punct>::iterator it=v.begin(),fin=v.end();it!=fin;++it)
{
d[it->x][it->y]=0;
++u;
q[u]=*it;
// q.push(*it);
}
p=1;
while(p<=u)
{
xx=q[p].x;
yy=q[p].y;
++p;
for(dir=0;dir<=3;++dir)
{
nxx=xx+dx[dir];
nyy=yy+dy[dir];
if(!ein(nxx,nyy))
continue;
if(a[nxx][nyy]||d[xx][yy]+1>=d[nxx][nyy])
continue;
d[nxx][nyy]=1+d[xx][yy];
++u;
q[u]=mp(nxx,nyy);
// q.push(mp(nxx,nyy));
}
}
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
b[i][j]=-1;
b[pi.x][pi.y]=d[pi.x][pi.y];
p=u=1;
q[1]=pi;
// q.push(pi);
while(p<=u)
{
xx=q[p].x;
yy=q[p].y;
++p;
if(xx==pf.x&&yy==pf.y)
ok=1;
for(dir=0;dir<=3;++dir)
{
nxx=xx+dx[dir];
nyy=yy+dy[dir];
if(!ein(nxx,nyy))
continue;
if(a[nxx][nyy]==0&&min(b[xx][yy],d[nxx][nyy])>b[nxx][nyy])
{
++u;
q[u]=mp(nxx,nyy);
b[nxx][nyy]=min(b[xx][yy],d[nxx][nyy]);
}
}
}
if(!ok)
g<<-1<<'\n';
else
g<<b[pf.x][pf.y]<<'\n';
return 0;
}