Pagini recente » Cod sursa (job #2216223) | Cod sursa (job #2985775) | Cod sursa (job #2068489) | Cod sursa (job #1711258) | Cod sursa (job #419845)
Cod sursa(job #419845)
#include<algorithm>
using namespace std;
#define Nmax 1510
struct cod{int x, y;} l[Nmax*Nmax],start,fin;
int cost[Nmax][Nmax],N,M,st,dr,k=1,cdr,cst,mij,ok,rez;
char v[Nmax][Nmax];
int rec[Nmax][Nmax];
char dx[5]={0,1,-1,0,0};
char dy[5]={0,0,0,1,-1};
int ver(int x,int y)
{
if(x>N||x<1)
return 0;
if(y>M||y<1)
return 0;
if(v[x][y]==0)
return 0;
if(cost[x][y]!=0)
return 0;
return 1;
}
int ver2(int x,int y)
{
if(x>N||x<1)
return 0;
if(y>M||y<1)
return 0;
if(v[x][y]==0)
return 0;
return 1;
}
void make_magic(int x,int y)
{
for(int i=1;i<=4;++i)
if(ver(x+dx[i],y+dy[i]))
{
cost[x+dx[i]][y+dy[i]]=cost[x][y]+1;
l[dr].x=x+dx[i];
l[dr].y=y+dy[i];
++dr;
}
}
void afis()
{
for(int i=1;i<=N;++i)
{
for(int j=1;j<=M;++j)
printf("%d ",cost[i][j]);
printf("\n");
}
}
int fill()
{
st=0;
dr=1;
int x,y;
while(st<dr&&rec[fin.x][fin.y]!=k)
{
x=l[st].x;
y=l[st].y;
rec[x][y]=k-1;
for(int i=1;i<=4;++i)
{
if(ver2(x+dx[i],y+dy[i]))
{
if(rec[x+dx[i]][y+dy[i]]!=k)
{
if(cost[x+dx[i]][y+dy[i]]>=mij)
{
l[dr].x=x+dx[i];
l[dr].y=y+dy[i];
++dr;
rec[x+dx[i]][y+dy[i]]=k;
}
}
}
}
++st;
}
if(rec[fin.x][fin.y]==k)
return 1;
return 0;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n",&N,&M);
for(int i=1;i<=N;++i)
{
for(int j=1;j<=M;++j)
{
scanf("%c",&v[i][j]);
if(v[i][j]=='D')
{cost[i][j]=1;
l[dr].x=i;
l[dr].y=j;
++dr;
}
if(v[i][j]=='I')
{
start.x=i;
start.y=j;
}
if(v[i][j]=='*')
v[i][j]=0;
if(v[i][j]=='O')
{
fin.x=i;
fin.y=j;
}
}
scanf("\n");
}
while(st<dr)
{
make_magic(l[st].x,l[st].y);
++st;
}
l[0].y=start.x;
l[0].x=start.y;
rec[start.x][start.y]=1;
cdr=min(cost[start.x][start.y],cost[fin.x][fin.y]);
cst=1;
while(cst<=cdr)
{ l[0].x=start.x;
l[0].y=start.y;
mij=(cst+cdr)/2;
//printf("%d %d %d\n",cst,cdr,mij);
ok=fill();
//printf("%d\n",k);
if(ok)
{
rez=mij;
cst=mij+1;
}
else
{
cdr=mij-1;
}
// afis();
++k;
}
printf("%d",rez-1);
}