Pagini recente » Cod sursa (job #1186217) | Cod sursa (job #2201029) | Cod sursa (job #2111453) | Cod sursa (job #263707) | Cod sursa (job #1891114)
#include<stdio.h>
#define MAXN 1005
#define NRDIR 4
#define inf 1e6+1
struct coord
{
int x,y;
};
void harsanDragonul();
bool harsanBarbarul(int dist);
void Bordaj();
void Reset();
FILE*fin,*fout;
int dx[NRDIR]={0,0,-1,1};
int dy[NRDIR]={1,-1,0,0};
int mat[MAXN][MAXN];
bool vizitat[MAXN][MAXN];
coord coada[10*MAXN*MAXN];
int pr=0,ult=-1;
int N,M;
coord start,finish;
int maxdist=-1;
int main()
{
fin=fopen("barbar.in","r");
fout=fopen("barbar.out","w");
fscanf(fin,"%d%d",&N,&M);
fgetc(fin);
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)
{
char c;
c=fgetc(fin);
if(c=='I')
{
start.x=i;
start.y=j;
}
else if(c=='O')
{
finish.x=i;
finish.y=j;
}
else if(c=='*')
{
mat[i][j]=-1;
vizitat[i][j]=1;
}
else if(c=='D')
{
coada[++ult].x=i;
coada[ult].y=j;
vizitat[i][j]=1;
}
}
fgetc(fin);
}
Bordaj();
harsanDragonul();
if(!harsanBarbarul(1))
{
fprintf(fout,"-1");
}
else
{
int ans=1;
int st=2,dr=maxdist;
while(st<=dr)
{
int mij=(st+dr)/2;
if(harsanBarbarul(mij))
{
ans=mij;
st=mij+1;
}
else
{
dr=mij-1;
}
}
fprintf(fout,"%d",ans);
}
fclose(fin);
fclose(fout);
return 0;
}
void harsanDragonul()
{
while(pr<=ult)
{
int ics=coada[pr].x;
int igrec=coada[pr].y;
if(maxdist<mat[ics][igrec])
{
maxdist=mat[ics][igrec];
}
for(int i=0;i<NRDIR;i++)
{
if(!vizitat[ics+dx[i]][igrec+dy[i]])
{
mat[ics+dx[i]][igrec+dy[i]]=mat[ics][igrec]+1;
vizitat[ics+dx[i]][igrec+dy[i]]=1;
coada[++ult].x=ics+dx[i];
coada[ult].y=igrec+dy[i];
}
}
pr++;
}
}
void Bordaj()
{
for(int i=0;i<=N+1;i++)
{
mat[i][0]=-1;
mat[i][M+1]=-1;
vizitat[i][0]=1;
vizitat[i][M+1]=1;
}
for(int i=0;i<=M+1;i++)
{
mat[0][i]=-1;
mat[N+1][0]=-1;
vizitat[0][i]=1;
vizitat[N+1][i]=1;
}
}
bool harsanBarbarul(int dist)
{
Reset();
coada[++ult].x=start.x;
coada[ult].y=start.y;
vizitat[start.x][start.y]=1;
if(mat[start.x][start.y]<dist)
{
return 0;
}
while(pr<=ult)
{
int ics=coada[pr].x,igrec=coada[pr].y;
if(ics==finish.x && igrec==finish.y)
{
return 1;
}
for(int i=0;i<NRDIR;i++)
{
if((!vizitat[ics+dx[i]][igrec+dy[i]]) && (mat[ics+dx[i]][igrec+dy[i]]>=dist))
{
coada[++ult].x=ics+dx[i];
coada[ult].y=igrec+dy[i];
vizitat[ics+dx[i]][igrec+dy[i]]=1;
}
}
pr++;
}
return 0;
}
void Reset()
{
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)
{
vizitat[i][j]=0;
}
}
}