Pagini recente » Cod sursa (job #2341500) | Cod sursa (job #1516017) | Cod sursa (job #2525586) | Cod sursa (job #3000452) | Cod sursa (job #3242559)
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
bool a[1005][1005];
int d[1005][1005], r, c;
int di[4]={-1, 1, 0, 0},
dj[4]={0, 0, -1, 1};
//0-Up, 1-Down, 2-Left, 3-Right
struct cell
{
int i, j;
}in, out;
queue<cell> q;
void LEED()
{
if(q.empty())
return;
int s=q.size();
while(s--)
{
cell c=q.front();
q.pop();
for(int k=0;k<4;k++)
{
if(d[c.i+di[k]][c.j+dj[k]]==-1)
{
d[c.i+di[k]][c.j+dj[k]]=d[c.i][c.j]+1;
q.push({c.i+di[k], c.j+dj[k]});
}
else if(d[c.i+di[k]][c.j+dj[k]]!=-2)
d[c.i+di[k]][c.j+dj[k]]=min(d[c.i+di[k]][c.j+dj[k]], d[c.i][c.j]+1);
}
}
LEED();
}
bool LEEN(int dmin)
{
if(q.empty())
return 0;
int s=q.size();
while(s--)
{
cell c=q.front();
q.pop();
for(int k=0;k<4;k++)
if(d[c.i+di[k]][c.j+dj[k]]>=dmin && a[c.i+di[k]][c.j+dj[k]]==0)
{
if(c.i+di[k]==out.i && c.j+dj[k]==out.j)
return 1;
a[c.i+di[k]][c.j+dj[k]]=1;
q.push({c.i+di[k], c.j+dj[k]});
}
}
return LEEN(dmin);
}
void reset()
{
while(!q.empty())
q.pop();
q.push(in);
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
a[i][j]=0;
a[in.i][in.j]=1;
}
int caut_bin()
{
int r=0, pas=(1<<9);
while(pas)
{
reset();
if(d[in.i][in.j]>=r+pas)
if(LEEN(r+pas))
r+=pas;
pas/=2;
}
if(r==0)
return -1;
return r;
}
void mark()
{
for(int i=1;i<=r;i++)
d[i][0]=d[i][c+1]=-2;
for(int i=1;i<=c;i++)
d[0][i]=d[r+1][i]=-2;
}
int main()
{
char ch;
cin>>r>>c;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
{
d[i][j]=-1;
cin>>ch;
if(ch=='*')
d[i][j]=-2;
else if(ch=='I')
in={i, j};
else if(ch=='O')
out={i, j};
else if(ch=='D')
{
q.push({i, j});
d[i][j]=0;
}
}
LEED();
mark();
cout<<caut_bin();
return 0;
}