Pagini recente » Cod sursa (job #1513485) | Cod sursa (job #1940818) | Cod sursa (job #2941424) | Cod sursa (job #471291) | Cod sursa (job #1125366)
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
struct POINT
{
int x,y;
};
POINT tata,fiu;
queue <POINT> q;
int n,m,i,j,d[1010][1010],dx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1},xs,ys;
char harta[1010][1010];
bool viz[1010][1010];
bool inside(int x,int y)
{
return 0<x&&x<=n&&0<y&&y<=m;
}
bool drum(int ok)
{
bool answer=false;
tata.x=xs;
tata.y=ys;
q.push(tata);
while(!q.empty())
{
tata=q.front();
//printf("%d %d %d\n",tata.x,tata.y,d[tata.x][tata.y]);
for(i=1;i<=4;i++)
{
fiu.x=tata.x+dx[i];
fiu.y=tata.y+dy[i];
if((harta[fiu.x][fiu.y]=='.'||harta[fiu.x][fiu.y]=='D')&&inside(fiu.x,fiu.y)==true&&viz[fiu.x][fiu.y]==false&&ok<=d[fiu.x][fiu.y])
{
q.push(fiu);
viz[fiu.x][fiu.y]=true;
}
if(harta[fiu.x][fiu.y]=='O'&&ok<=d[fiu.x][fiu.y])
{
answer=true;
break;
}
}
q.pop();
}
while(!q.empty())
{
q.pop();
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
viz[i][j]=0;
return answer;
}
void bs(int st,int dr)
{
int med,last=-1;
while(st<=dr)
{
med=((dr-st)>>1)+st;
if(med<=d[xs][ys]&&drum(med)==true)
{
last=med;
st=med+1;
}
else
dr=med-1;
}
printf("%d",last);
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%c",&harta[i][j]);
d[i][j]=-1;
if(harta[i][j]=='D')
{
tata.x=i;
tata.y=j;
d[i][j]=0;
q.push(tata);
}
if(harta[i][j]=='*')
{
d[i][j]=-2;
}
if(harta[i][j]=='I')
{
xs=i;
ys=j;
}
}
scanf("\n");
}
/*for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
printf("%c",harta[i][j]);
}
printf("\n");
}*/
while(!q.empty())
{
tata=q.front();
for(i=1;i<=4;i++)
{
fiu.x=tata.x+dx[i];
fiu.y=tata.y+dy[i];
if(d[fiu.x][fiu.y]==-1&&inside(fiu.x,fiu.y)==true)
{
d[fiu.x][fiu.y]=d[tata.x][tata.y]+1;
if(d[tata.x][tata.y]==0)
d[fiu.x][fiu.y]=1;
q.push(fiu);
}
}
q.pop();
}
/*for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(d[i][j]<0)
printf(" %d",d[i][j]);
else
printf(" %d",d[i][j]);
}
printf("\n");
}*/
bs(0,max(m,n));
return 0;
}