Pagini recente » Cod sursa (job #3286960) | Cod sursa (job #2912270) | Cod sursa (job #2011969) | Cod sursa (job #1718403) | Cod sursa (job #415348)
Cod sursa(job #415348)
#include<stdio.h>
struct cd{
int i,j,cost;
};
const int di[5]={0,0,1,-1,0};
const int dj[5]={0,1,0,0,-1};
long m[1001][1001];
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int r,c,i,j,k=1,x1,x2,y1,y2,in=1,sf=2,iv,jv,max=0,p,poz;
char ch;
cd q[1001],a;
scanf("%d%d\n",&r,&c);
for(i=1;i<=r;i++){
for(j=1;j<=c;j++){
scanf("%c",&ch);
if(ch=='.'){
m[i][j]=99999;
}
if(ch=='D'){
m[i][j]=0;
q[k].i=i;
q[k].j=j;
q[k].cost=0;
k++;
}
if(ch=='I'){
x1=i;
y1=j;
m[i][j]=99999;
}
if(ch=='O'){
x2=i;
y2=j;
m[i][j]=99999;
}
if(ch=='*'){
m[i][j]=-1;
}
}
scanf("\n");
}
sf=k;
while(in<sf)
{
a=q[in];
in++;
for(i=1;i<=4;i++)
{
iv=a.i+di[i];
jv=a.j+dj[i];
if((1<=iv)&&(iv<=r)&&(1<=jv)&&(jv<=c)&&(m[iv][jv]!=-1)&&(a.cost+1<m[iv][jv]))
{
m[iv][jv]=a.cost+1;
q[sf].i=iv;
q[sf].j=jv;
q[sf].cost=a.cost+1;
sf++;
if(q[sf].cost>max){
max=q[sf].cost;
}
}
}
}
for(p=1;p*2<=max;p*=2);
for(poz=0;p;p/=2){
if(poz+p<=max){
poz+=p;
while(in<sf)
{
a=q[in];
in++;
for(i=1;i<=4;i++)
{
iv=a.i+di[i];
jv=a.j+dj[i];
if((1<=iv)&&(iv<=r)&&(1<=jv)&&(jv<=c)&&(m[iv][jv]!=-1)&&(a.cost+1<m[iv][jv]))
{
m[iv][jv]=a.cost+1;
q[sf].i=iv;
q[sf].j=jv;
q[sf].cost=a.cost+1;
sf++;
if(q[sf].cost>max)
{
max=q[sf].cost;
}
}
}
}
return 0;
}