Pagini recente » Cod sursa (job #2921432) | Cod sursa (job #2612365) | Cod sursa (job #2537304) | Cod sursa (job #2931260) | Cod sursa (job #407021)
Cod sursa(job #407021)
#include<cstdio>
using namespace std;
const int N=1000;
char a[N];
int b[N][N];
int n,u,m;
struct pol{int x,y;};
pol c[N*N],sr[3];
int k=0;
int viz[N][N],dl []={0, 0, 0, 1, -1}, dc []={0, -1, 1, 0, 0};
void brodare();
void read()
{
freopen("barbar.in","r",stdin);
int i;
scanf("%d%d\n",&n,&m);
brodare ();
for(i=1;i<=n;i++)
{
scanf("%s\n",a+1);
for(int j=1;j<=m;j++)
{
if(a[j]=='D')
{
b[i][j]=0;
k++;
c[k].x=i,c[k].y=j;
viz[i][j]=1;
}
if(a[j]=='*')
{
viz[i][j]=1;
b[i][j]=-2;
}
if(a[j]=='I')
sr[1].x=i,sr[1].y=j;
if(a[j]=='O')
sr[0].x=i,sr[0].y=j;
}
}
}
void brodare()
{
for(int i=0;i<=n;i++)
{
for(int j=1;j<=m;j++)
b[i][j]=-1;
viz [0] [i]=viz [n+1] [i]=1;
viz [i] [0]=viz [i] [m+1]=1;
}
}
void lee()
{
int p=1,u=k,i;
pol r;//tip definit de mn, la fel ca si tipu in care sunt stocati politistii
while(p<=u)
{
r=c[p];
for(i=1;i<=4;i++)
{ //vecin=a[r.x+dl[i]][r.y+dl[i]];
if(viz[r.x+dl[i]][r.y+dc[i]]==0)//daca vecinu e nevizitat
{
u++;
c[u].x=r.x+dl[i];
c[u].y=r.y+dc[i];
b[r.x+dl[i]][r.y+dc[i]]=1+b[r.x][r.y];
viz[r.x+dl[i]][r.y+dc[i]]=1;
}
}
++p;
}
}
void reset()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
viz[i][j]=0;
}
int bfs(int h)
{
reset();
int p=1,u=1,i;
pol r;
if(b[sr[1].x][sr[1].y]<h)
return 0;
c[1]=sr[1];
viz[sr[1].x][sr[1].y]=1;
while(p<=u)
{
r=c[p];
for(i=1;i<=4;i++)
{
if(b[r.x+dl[i]][r.y+dc[i]]>=h && viz[r.x+dl[i]][r.y+dc[i]]==0)//dist e cel putin h & nodu nu e vizitat
{
u++;
c[u].x=r.x+dl[i];
c[u].y=r.y+dc[i];
//ici ce fac? zic eu nimic,
viz[r.x+dl[i]][r.y+dc[i]]=1;
}
}
++p;
}
//return viz[sr[0].x][sr[0].y];//daca nodul final ajunge sa fie vizitat sau nu
if(viz[sr[0].x][sr[0].y]==1)
return 1;
return 0;
}
int bsearch(int in,int sf)
{
int mij,ok=-1;
while(in<sf)
{
mij=(in+sf)/2;
if(bfs(mij)==1)
{
in=mij+1;
ok=mij;
}
else
sf=mij-1;
}
return ok;
}
int main()
{
freopen("barbar.out","w",stdout);
//brodare();
read();
lee();
printf("%d",bsearch(0,n*m));
return 0;
}