Pagini recente » Cod sursa (job #2619481) | Cod sursa (job #2181386) | Cod sursa (job #1118926) | Cod sursa (job #3128383) | Cod sursa (job #407505)
Cod sursa(job #407505)
#include<cstdio>
using namespace std;
const int N=1020;
char a[N];
int b[N][N];
int n,u,m;
struct pol{int x,y;};
pol c[N*N*3],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();
if(!h)
return 1;
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 main()
{
freopen("barbar.out","w",stdout);
//brodare();
read();
lee();
int rasp=0,pas=1<<10; // a<<b; a * 2^b
while(pas>0)
{
if (bfs(rasp+pas))
rasp += pas;
pas /= 2; //pas >>= 1;
}
if (rasp == 0)
printf("-1");
else
printf("%d\n", rasp);
return 0;
}