Pagini recente » Cod sursa (job #498837) | Cod sursa (job #2510509) | Cod sursa (job #277333) | Cod sursa (job #903795) | Cod sursa (job #560484)
Cod sursa(job #560484)
#include<cstdio>
#include<fstream>
#include<cstring>
#include<queue>
using namespace std;
#define nrn 1001
struct punct{int x,y;} I,O;
int A[nrn][nrn];
bool viz[nrn][nrn];
queue<punct>Q;
int R,L;
FILE *out=fopen("barbar.out","w");
int const dx[]={-1,0,1,0};
int const dy[]={0,1,0,-1};
int drum(int val)
{
int i;
punct p,aux;
for(i=1;i<=R;++i)
memset(viz[i],0,sizeof(viz[i]));
Q.push(I);
while(!Q.empty())
{
p=Q.front();
Q.pop();
viz[p.x][p.y]=1;
if(p.x==O.x&&p.y==O.y)
{
while(!Q.empty())
Q.pop();
return 1;
}
for(i=0;i<4;++i)
{
if(A[p.x+dx[i]][p.y+dy[i]]>=val&&!viz[p.x+dx[i]][p.y+dy[i]])
{
aux.x=p.x+dx[i];
aux.y=p.y+dy[i];
viz[aux.x][aux.y]=true;
Q.push(aux);
}
}
}
return 0;
}
int main()
{
int i,j;
punct p,aux;
char c;
ifstream in("barbar.in");
in>>R>>L;
for(i=1;i<=R;++i)
for(j=1;j<=L;++j)
{
in>>c;
switch(c)
{
case('*'):A[i][j]=-1;break;
case('D'):A[i][j]=1,p.x=i,p.y=j,Q.push(p);break;
case('I'):I.x=i,I.y=j;break;
case('O'):O.x=i,O.y=j;break;
}
}
for(i=0;i<=R+1;++i)
A[i][0]=A[i][L+1]=-1;
for(j=1;j<=L;++j)
A[0][j]=A[R+1][j]=-1;
while(!Q.empty())
{
p=Q.front();
Q.pop();
for(i=0;i<4;++i)
{
if(A[p.x+dx[i]][p.y+dy[i]]>=0)
{
if(A[p.x+dx[i]][p.y+dy[i]]!=0&&A[p.x+dx[i]][p.y+dy[i]]<A[p.x][p.y]+1) continue;
A[p.x+dx[i]][p.y+dy[i]]=A[p.x][p.y]+1;
aux.x=p.x+dx[i];
aux.y=p.y+dy[i];
Q.push(aux);
}
}
}
int lf,rt,mid,sol=-2;;
lf=1;rt=R+L+1;
while(lf<=rt)
{
mid=(lf+rt)/2;
if(drum(mid))
{
sol=mid;
lf=mid+1;
}
else rt=mid-1;
}
--sol;
fprintf(out,"%d\n",sol);
return 0;
}