Pagini recente » Cod sursa (job #2867224) | Cod sursa (job #2858865) | Cod sursa (job #56045) | Cod sursa (job #1141952) | Cod sursa (job #896212)
Cod sursa(job #896212)
#include<cstdio>
#include<cstring>
#define BIG 1<<30
#define MAX_SIZE 1005
#define GOOD -2
#define min(a,b) ((a)<(b)?(a):(b))
FILE *f=fopen("barbar.in","r");
FILE *g=fopen("barbar.out","w");
using namespace std;
int a[MAX_SIZE][MAX_SIZE],l_dr[1000000],c_dr[1000000];
int b[MAX_SIZE][MAX_SIZE];
int start_i,start_j;
bool viz[MAX_SIZE][MAX_SIZE];
int dx[]={-1,1,0,0},dy[]={0,0,1,-1};
int N,M,pos1,pos2;
char ch[1005];
int result;
int q;
void read ( void )
{
fscanf(f,"%d%d",&N,&M);
fscanf(f,"%c",&ch);
for( int i(1); i <= N; ++i )
{
fscanf(f,"%s",&ch);
for(int ii(0) ; ch[ii];++ii)
{
if(ch[ii]=='.')
continue;
if(ch[ii] == 'I' )
{
start_i=i;
start_j=ii;
continue;
}
if(ch[ii] == '*' )
{
a[i][ii]=-BIG;
continue;
}
if(ch[ii] == 'D' )
{
b[i][ii]=0;
l_dr[++q]=i;
c_dr[q]=ii;
}
if(ch[ii] == 'O' )
{
a[i][ii]=GOOD;
}
}
}
}
inline void mod ( void )
{
int i,j;
for(i=0;i<=N+1;i++)
{
b[i][0]=-1;
b[i][M+1]=-1;
a[i][0]=-BIG;
a[i][M+1]=-BIG;
}
for(j=0;j<=M+1;j++)
{
b[0][j]=-1;
b[N+1][j]=-1;
a[0][j]=-BIG;
a[N+1][j]=-BIG;
}
a[0][0]=-BIG;
}
void bfs( void )
{
int x,y,xnou,ynou;
for(int i(1); i <= q; ++i)
{
x=l_dr[i];
y=c_dr[i];
for(int ii(0); ii <= 3; ++ii )
{
xnou=x+dx[ii];
ynou=y+dy[ii];
if( a[xnou][ynou]!=-BIG && b[xnou][ynou] == 0 || b[x][y]+1 <= b[xnou][ynou] && b[xnou][ynou]!=-1&& 1<= xnou &&xnou <=N && 1<= ynou && ynou<=M)
{
b[xnou][ynou]=b[x][y]+1;
q++;
l_dr[q]=xnou;
c_dr[q]=ynou;
}
}
}
}
int bfs2( int m )
{
int k=1;
memset(viz,0,sizeof(viz));
l_dr[1]=start_i;
c_dr[1]=start_j;
viz[l_dr[1]][c_dr[1]]=1;
int x,y,xnou,ynou;
for(int i(1); i <= k; ++i )
{
x=l_dr[i];
y=c_dr[i];
for(int ii(0); ii <= 3; ++ii)
{
xnou=x+dx[ii];
ynou=y+dy[ii];
if(viz[xnou][ynou] == 0 && a[xnou][ynou]!=-BIG && b[xnou][ynou] >= m)
{
viz[xnou][ynou]=1;
++k;
l_dr[k]=xnou;
c_dr[k]=ynou;
if(a[xnou][ynou] == GOOD )
return 1;
}
}
}
return 0;
}
void solve ( void )
{
int left=0,right=1000000;
while( left <= right )
{
int mid=(left+right)/2;
if( bfs2(mid) == 1 )
{
result=mid;
left=mid+1;
continue;
}
right=mid-1;
}
}
inline void write( void )
{
if(result == 0)
fprintf(g,"-1");
else
fprintf(g,"%d",result);
fclose(g);
}
int main()
{
read();
mod();
bfs();
solve();
write();
return 0;
}