Pagini recente » Cod sursa (job #1701980) | Cod sursa (job #1785163) | Cod sursa (job #11668) | Cod sursa (job #1113524) | Cod sursa (job #1525460)
#include<iostream>
#include<fstream>
#include<queue>
#include<bitset>
#define mkp make_pair
using namespace std;
ifstream si("barbar.in");
ofstream so("barbar.out");
//FILE*so=fopen("balulbobocilor.out","w");
const int NMAX=1005;
const int D=0,L=-1,P=-2;
int n,m;
bitset<NMAX> viz[NMAX];
queue< pair<int,int> > q;
int dist[NMAX][NMAX];
int dr;
int s[]={1,0,-1,0};
int j[]={0,1,0,-1};
void crearedist()
{
int x,y;
int i;
while(!q.empty())
{
x=q.front().first;
y=q.front().second;
q.pop();
for(i=0;i<4;++i)
{
if(dist[x+s[i]][y+j[i]]==-1)
{
dist[x+s[i]][y+j[i]]=dist[x][y]+1;
dr=dist[x+s[i]][y+j[i]];
q.push( mkp(x+s[i],y+j[i]) );
}
}
}
}
int sx,sy,fx,fy;
bool pos(int dmin)
{
queue< pair<int,int> > cord;
cord.push( mkp(sx,sy) );
int x,y,i;
viz[sx][sy]=1;
while(!cord.empty())
{
x=cord.front().first;
y=cord.front().second;
cord.pop();
if(x==fx&&y==fy)
return true;
for(i=0;i<4;++i)
{
if(dist[x+s[i]][y+j[i]]>=dmin&&viz[x+s[i]][y+j[i]]==0)
{
viz[x+s[i]][y+j[i]]=1;
cord.push( mkp(x+s[i],y+j[i]) );
}
}
}
return false;
}
int rez()
{
int i;
int sol=-1,st=0,mij;
while(st<=dr)
{
for(i=1;i<n;++i)
viz[i].reset();
mij=(st+dr)>>1;
//cout<<mij<<'\n';
if(pos(mij))
{
st=mij+1;
sol=mij;
}
else
dr=mij-1;
}
return sol;
}
int main()
{
si>>n>>m;
++n;
++m;
int i,j;
char a;
for(i=1;i<n;++i)
{
for(j=1;j<m;++j)
{
si>>a;
switch(a)
{
case '.': dist[i][j]=L; break;
case '*': dist[i][j]=P; break;
case 'D': dist[i][j]=D; q.push(mkp(i,j)); break;
case 'I': sx=i; sy=j; dist[i][j]=L; break;
case 'O': fx=i; fy=j; dist[i][j]=L; break;
}
}
dist[i][0]=P;
dist[i][m]=P;
}
for(j=0;j<=m;++j)
{
dist[0][j]=P;
dist[n][j]=P;
}
crearedist();
//cout<<pos(2);
so<<rez()<<'\n';
so.close();
}