Pagini recente » Cod sursa (job #828994) | Cod sursa (job #1353892) | Cod sursa (job #1279458) | Cod sursa (job #2406669) | Cod sursa (job #1516848)
#include<iostream>
#include<fstream>
#include<queue>
#include<bitset>
#include<algorithm>
#include<cstring>
using namespace std;
const int NMAX=1005;
ifstream si("barbar.in");
ofstream so("barbar.out");
char v[NMAX][NMAX];
int dd[NMAX][NMAX];
struct pct
{
int cx,cy,lg;
};
int dir[][2]={{0,1},{1,0},{-1,0},{0,-1}};
queue<pct> q;
void bfs(int st,int dr)
{
pct p;
int x,y,l;
p.cx=st;
p.cy=dr;
p.lg=1;
q.push(p);
int i;
while(!q.empty())
{
p=q.front();
x=p.cx;
y=p.cy;
l=p.lg;
//cout<<x<<' '<<y<<' '<<l<<'\n';
for(i=0;i<4;++i)
{
if(v[x+dir[i][0]][y+dir[i][1]]!='*')
{
if(dd[x+dir[i][0]][y+dir[i][1]]>l||dd[x+dir[i][0]][y+dir[i][1]]==-1)
{
dd[x+dir[i][0]][y+dir[i][1]]=l;
p.cx=x+dir[i][0];
p.cy=y+dir[i][1];
p.lg=l+1;
q.push(p);
}
}
}
q.pop();
}
}
int mm[NMAX][NMAX];
void parcurg(int sx,int sy,int fx,int fy)
{
//mm[sx][sy]=dd[sx][sy];
pct p;
p.cx=sx;
p.cy=sy;
p.lg=dd[sx][sy];
q.push(p);
int l,i;
while(!q.empty())
{
p=q.front();
q.pop();
sx=p.cx;
sy=p.cy;
l=p.lg;
if(mm[sx][sy]<l)
{
mm[sx][sy]=l;
if(v[sx][sy]!='O')
{
for(i=0;i<4;++i)
{
if(v[sx+dir[i][0]][sy+dir[i][1]]!='*')
{
p.cx=sx+dir[i][0];
p.cy=sy+dir[i][1];
p.lg=min(l,dd[sx+dir[i][0]][sy+dir[i][1]]);
q.push(p);
}
}
}
}
}
}
int main()
{
int n,m;
si>>n>>m;
int i,j;
++n;
++m;
memset(dd,-1,sizeof dd);
int cxs,cys,cyf,cxf;
for(i=1;i<n;++i)
{
for(j=1;j<m;j++)
{
si>>v[i][j];
if(v[i][j]=='I')
{
cxs=i;
cys=j;
}
else
{
if(v[i][j]=='O')
{
cxf=i;
cyf=j;
}
else
{
if(v[i][j]=='D')
{
dd[i][j]=0;
}
}
}
}
v[i][0]='*';
v[i][m]='*';
}
for(i=0;i<=m;++i)
{
v[0][i]='*';
v[n][i]='*';
}
for(i=1;i<n;++i)
{
for(j=1;j<m;++j)
{
if(v[i][j]=='D')
bfs(i,j);
}
}/*
for(i=1;i<n;++i)
{
for(j=1;j<m;++j)
{
cout<<dd[i][j]<<' ';
}
cout<<'\n';
}*/
memset(mm,-1,sizeof mm);
parcurg(cxs,cys,cxf,cyf);
so<<mm[cxf][cyf]<<'\n';
so.close();
si.close();
return 0;
}