Pagini recente » Cod sursa (job #1339469) | Cod sursa (job #2933044) | Cod sursa (job #2494420) | Cod sursa (job #2904583) | Cod sursa (job #124071)
Cod sursa(job #124071)
#include<stdio.h>
#define MAXCOADA 1000*1000
FILE *fin2=freopen("barbar.in","r",stdin);
FILE *fout=freopen("barbar.out","w",stdout);
struct poz
{
int x;
int y;
};
poz Coada[MAXCOADA*2+1];
poz Coada2[MAXCOADA*2+1];
int n,col,fx,fy;
int fin,m[1001][1001],m1[1001][1001];
int fin1;
void citeste()
{
int i,j;
i=1; j=0;
scanf("%d%d\n",&n,&col);
while(!feof(fin2))
{
char c;
scanf("%c",&c);
if(c=='\n'){if(j){ i++; j=0;}}
else
{
j++;
switch(c)
{
case '.':
m[i][j]=-1;
m1[i][j]=-1;
break;
case 'D':
m[i][j]=-2;
m1[i][j]=0;
Coada2[fin1].y=i;
Coada2[fin1++].x=j;
break;
case '*':
m[i][j]=-3;
m1[i][j]=-3;
break;
case 'I':
m[i][j]=0;
m1[i][j]=0;
Coada[fin].y=i;
Coada[fin].x=j;
Coada2[fin1].y=i;
Coada2[fin1++].x=j;
break;
case 'O':
m[i][j]=-1;
m1[i][j]=-1;
fy=i;
fx=j;
break;
}
}
}
fin1--;
fclose(fin2);
}
void bordeaza()
{
int i,j;
for(i=1;i<=n;i++)
{
m[i][0]=-2;
m[i][col+1]=-2;
}
for(j=1;j<=col;j++)
{
m[0][j]=-2;
m[n+1][j]=-2;
}
}
int dx[]={0,0,0,1,-1};
int dy[]={0,1,-1,0,0};
void rezolva()
{
bordeaza();
int ini=0;
int ini1; ini1=0;
poz x,y,x1,y1;
while(ini<=fin && m[fy][fx]==-1)
{
x=Coada[ini++];
x1=Coada2[ini1++];
for(int i=1;i<=4;i++)
{
y.y=x.y+dy[i];
y.x=x.x+dx[i];
y1.y=x1.y+dy[i];
y1.x=x1.x+dx[i];
if(m[y.y][y.x]==-1 && m[y.y][y.x]>-2)
{
m[y.y][y.x]=1+m[x.y][x.x];
Coada[++fin]=y;
}
if(m1[y1.y][y1.x]==-1 && m1[y1.y][y1.x]>-2)
{
m1[y1.y][y1.x]=1+m1[x1.y][x1.x];
Coada2[++fin1]=y1;
}
}
}
}
int check(int i,int j)
{
int x1,x2;
int ret=2;
x1=x2=j;
while(x1>1 || x2<col)
{
if(x1>1)x1--;
if(x2<col)x2++;
if((m1[i][x1]==0 || m1[i][x2]==0) && ret==2)
{
ret=1;
}
if((m[i][x1]==-3 || m1[i][x2]==-3) && ret==2)
{
ret=0;
break;
}
}
int y1,y2;
y1=y2=i;
if(ret!=1){
ret=2;
while(y1>1 || y2<col)
{
if(y1>1)y1--;
if(y2<col)y2++;
if((m1[y1][j]==0 || m1[y2][j]==0) && ret==2)
{
ret=1;
}
if((m[y1][j]==-3 || m1[y2][j]==-3) && ret==2)
{
ret=0;
break;
}
}
}
return ret;
}
void afiseaza()
{
int i=fy;
int j=fx;
int max=m1[i][j];
while(m[i][j]!=0)
{
for(int k=1;k<=4;k++)
{
if(m[i][j]==m[i+dy[k]][j+dx[k]]+1)
{
i=i+dy[k];
j=j+dx[k];
if(max<m1[i][j] && check(i,j)==1)
max=m1[i][j];
}
}
}
printf("%d ",max);
fclose(fout);
}
int main()
{
citeste();
rezolva();
afiseaza();
return 0;
}