Pagini recente » Cod sursa (job #1306318) | Cod sursa (job #2162698) | Cod sursa (job #2474811) | Cod sursa (job #3309027) | Cod sursa (job #3341513)
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
const int NMAX=1000;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
queue<int>qx,qy;
char p[NMAX+2][NMAX+2];
int dist[NMAX+2][NMAX+2];
int auxx,auxy,noux,nouy;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
bool viz[NMAX+2][NMAX+2];
int xs,ys,xd,yd;
int r,c;
bool valid(int dist_min)
{
int dir,found=0;
memset(viz,0,sizeof(viz));
while(!qx.empty())
qx.pop();
while(!qy.empty())
qy.pop();
if(dist[xs][ys]<dist_min)
return 0;
qx.push(xs);
qy.push(ys);
viz[xs][ys]=1;
while(!qx.empty()&&!found)
{
auxx=qx.front();
auxy=qy.front();
qx.pop();
qy.pop();
for(dir=0;dir<4;dir++)
{
noux=auxx+dx[dir];
nouy=auxy+dy[dir];
if(noux>=1&&noux<=r&&nouy>=1&&nouy<=c)
if(p[noux][nouy]!='#')
if(dist[noux][nouy]>=dist_min&&!viz[noux][nouy])
{
viz[noux][nouy]=1;
qx.push(noux);
qy.push(nouy);
if(noux==xd&&nouy==yd)
found=1;
}
}
}
return found;
}
int main()
{
int i,j,dir;
fin>>r>>c;
memset(viz,0,sizeof(viz));
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
{
fin>>p[i][j];
if(p[i][j]=='I')
{
xs=i;
ys=j;
}
else if(p[i][j]=='O')
{
xd=i;
yd=j;
}
else if(p[i][j]=='D')
{
qx.push(i);
qy.push(j);
viz[i][j]=1;
}
}
while(!qx.empty())
{
auxx=qx.front();
auxy=qy.front();
qx.pop();
qy.pop();
for(dir=0;dir<4;dir++)
{
noux=auxx+dx[dir];
nouy=auxy+dy[dir];
if(noux>=1&&noux<=r&&nouy>=1&&nouy<=c)
if((p[noux][nouy]=='.'||p[noux][nouy]=='I'||p[noux][nouy]=='O')&&!viz[noux][nouy])
{
dist[noux][nouy]=dist[auxx][auxy]+1;
viz[noux][nouy]=1;
qx.push(noux);
qy.push(nouy);
}
}
}
int last=-1;
int st=0;
int dr=dist[xs][ys];
int mij;
while(st<=dr)
{
mij=(st+dr)/2;
if(valid(mij))
{
last=mij;
st=mij+1;
}
else
dr=mij-1;
}
fout<<last;
return 0;
}