Pagini recente » Cod sursa (job #298098) | Cod sursa (job #2178367) | Cod sursa (job #674259) | Cod sursa (job #2284122) | Cod sursa (job #441199)
Cod sursa(job #441199)
#include <fstream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
struct punct{short int lin,col;};
const short int dl[]={-1,0,1,0};
const short int dc[]={0,1,0,-1};
punct coada[1000000],x,z;
int v[1001][1001],p,u,m,n;
bool q[1001][1001];
void lee()
{
punct x,y;
int i,j;
while (p!=u)
for (i=0,x=coada[++p];i<4;i++)
{
y.lin=x.lin+dl[i];
y.col=x.col+dc[i];
if (v[y.lin][y.col]>v[x.lin][x.col]+1)
{
coada[++u]=y;
v[y.lin][y.col]=v[x.lin][x.col]+1;
}
}
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (v[i][j]==32000)
v[i][j]=-1;
}
bool good(short int safe)
{
p=u=0;
int i,j;
punct y,t;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
q[i][j]=false;
if (v[x.lin][x.col]>=safe)
{
q[x.lin][x.col]=true;
coada[++u]=x;
}
while (p<u && !q[z.lin][z.col])
for (i=0,y=coada[++p];i<4;i++)
{
t.lin=y.lin+dl[i];
t.col=y.col+dc[i];
if (!q[t.lin][t.col] && v[t.lin][t.col]>=safe)
{
q[t.lin][t.col]=true;
coada[++u]=t;
}
}
return q[z.lin][z.col];
}
void bsearch()
{
int i,step=1<<10;
lee();
for (i=0;step;step>>=1)
if (v[z.lin][z.col]>=i+step && good(i+step))
i+=step;
if (i>0)
out<<i<<"\n";
else
out<<"-1\n";
}
int main()
{
int i,j;
char s[1<<10];
in>>n>>m;
in.get();
for (i=0;i<=m+1;i++)
{
v[0][i]=-1;
v[n+1][i]=-1;
}
for (i=0;i<=n+1;i++)
{
v[i][0]=-1;
v[i][n+1]=-1;
}
for (i=1;i<=n;i++)
{
in.getline(s+1,m+1);
for (j=1;j<=m;j++)
switch(s[j])
{
case '.':v[i][j]=32000;break;
case '*':v[i][j]=-1;break;
case 'D':coada[++u].lin=i;coada[u].col=j;v[i][j]=0;break;
case 'I':x.lin=i;x.col=j;v[i][j]=32000;break;
case 'O':z.lin=i;z.col=j;v[i][j]=32000;break;
}
}
bsearch();
return 0;
}