Pagini recente » Cod sursa (job #834957) | Cod sursa (job #315407) | Cod sursa (job #565101) | Cod sursa (job #378391) | Cod sursa (job #1757555)
#include<fstream>
#include<deque>
#include<bitset>
#include<cstring>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
const int dx[]={-1,0,1,0};
const int dy[]={0,1,0,-1};
bitset<1005>viz[1005];
deque<int>qx,qy;
int X,Y;
int v[1005][1005];
void lee()
{
int x,y,nx,ny;
while(!qx.empty())
{
x=qx.front();
y=qy.front();
qx.pop_front();
qy.pop_front();
for(int i=0;i<4;i++)
{
nx=x+dx[i];
ny=y+dy[i];
if(v[nx][ny]==0)
{
v[nx][ny]=v[x][y]+1;
qx.push_back(nx);
qy.push_back(ny);
}
}
}
}
void solve(int lim, bool &is)
{
memset(viz,0,sizeof(viz));
viz[qx.front()][qy.front()]=1;
int x,y,nx,ny;
while(!qx.empty())
{
x=qx.front();
y=qy.front();
qx.pop_front();
qy.pop_front();
for(int i=0;i<4;i++)
{
nx=x+dx[i];
ny=y+dy[i];
if(viz[nx][ny]==0&&v[nx][ny]>lim)
{
if(nx==X&&ny==Y)
{
is=true;
qx.clear();
qy.clear();
return;
}
viz[nx][ny]=1;
qx.push_back(nx);
qy.push_back(ny);
}
}
}
}
int main()
{
string read;
int n,m,x,y;
f>>n>>m;
for(int i=1;i<=n;i++)
{
f>>read;
read=" "+read;
for(int j=1;j<=m;j++)
{
if(read[j]=='*')
v[i][j]=-1;
else
{
if(read[j]=='D')
{
v[i][j]=1;
qx.push_back(i);
qy.push_back(j);
}
else
{
if(read[j]=='I')
{
x=i;
y=j;
}
else if(read[j]=='O')
{
X=i;
Y=j;
}
}
}
}
}
for(int i=0;i<=n+1;i++)
v[i][0]=v[i][m+1]=-1;
for(int j=0;j<=m+1;j++)
v[0][j]=v[n+1][j]=-1;
lee();
int st=0,dr=n*m,mij,ans;
bool is;
ans=0;
while(st<=dr)
{
mij=(st+dr)>>1;
is=false;
qx.push_back(x);
qy.push_back(y);
solve(mij,is);
if(is==true&&v[x][y]>mij)
{
st=mij+1;
ans=1;
}
else
dr=mij-1;
}
if(ans)
g<<dr;
else
g<<-1;
return 0;
}