Pagini recente » Cod sursa (job #1344200) | Cod sursa (job #94976) | Cod sursa (job #2006447) | Cod sursa (job #693600) | Cod sursa (job #487430)
Cod sursa(job #487430)
#include <fstream>
#include <queue>
//#define DEBUG
using namespace std;
const char InFile[]="barbar.in";
const char OutFile[]="barbar.out";
const int MaxN=1005;
const int MAX=1<<30;
const int i_disp[]={0,0,1,-1};
const int j_disp[]={1,-1,0,0};
ifstream fin(InFile);
ofstream fout(OutFile);
struct s_point
{
s_point(int i2=0,int j2=0):i(i2),j(j2){}
int i,j;
};
int vmin[MaxN][MaxN],R,C,sol,p,u,m;
int a[MaxN][MaxN];
char ch;
queue<s_point> q;
s_point in,out;
void lee()
{
s_point p;
int c;
while(!q.empty())
{
p=q.front();
q.pop();
c=vmin[p.i][p.j]+1;
for(register int i=0;i<4;++i)
{
if(vmin[p.i+i_disp[i]][p.j+j_disp[i]]>c)
{
vmin[p.i+i_disp[i]][p.j+j_disp[i]]=c;
q.push(s_point(p.i+i_disp[i],p.j+j_disp[i]));
}
}
}
}
bool is_good(int min)
{
for(register int i=1;i<=R;++i)
{
for(register int j=1;j<=C;++j)
{
a[i][j]=0;
}
}
for(register int i=0;i<=R+1;++i)
{
a[i][0]=1;
a[i][C+1]=1;
}
for(register int j=0;j<=C+1;++j)
{
a[0][j]=1;
a[R+1][j]=1;
}
a[in.i][in.j]=1;
q.push(in);
s_point p;
while(!q.empty())
{
p=q.front();
q.pop();
for(register int i=0;i<4;++i)
{
if(a[p.i+i_disp[i]][p.j+j_disp[i]]==0 && min<=vmin[p.i+i_disp[i]][p.j+j_disp[i]])
{
a[p.i+i_disp[i]][p.j+j_disp[i]]=1;
q.push(s_point(p.i+i_disp[i],p.j+j_disp[i]));
}
}
}
return a[out.i][out.j]==1;
}
int main()
{
fin>>R>>C;
for(register int i=1;i<=R;++i)
{
for(register int j=1;j<=C;++j)
{
fin>>ch;
if(ch=='.')
{
vmin[i][j]=MAX;
}
else if(ch=='D')
{
vmin[i][j]=0;
q.push(s_point(i,j));
}
else if(ch=='I')
{
vmin[i][j]=MAX;
in.i=i;
in.j=j;
}
else if(ch=='O')
{
vmin[i][j]=MAX;
out.i=i;
out.j=j;
}
else if(ch=='*')
{
vmin[i][j]=-2;
}
}
}
fin.close();
lee();
for(register int i=1;i<=R;++i)
{
for(register int j=1;j<=C;++j)
{
if(vmin[i][j]==MAX)
{
vmin[i][j]=-1;
}
}
}
#ifdef DEBUG
for(register int i=1;i<=R;++i)
{
for(register int j=1;j<=C;++j)
{
fout<<vmin[i][j]<<" ";
}
fout<<"\n";
}
fout<<"\n";
#endif
p=0;
u=vmin[in.i][in.j];
while(p<=u)
{
m=p+(u-p)/2;
if(is_good(m))
{
p=m+1;
sol=m;
}
else
{
u=m-1;
}
}
fout<<sol;
fout.close();
return 0;
}