Pagini recente » Cod sursa (job #1443874) | Cod sursa (job #1797701) | Cod sursa (job #3206970) | Cod sursa (job #243061) | Cod sursa (job #896337)
Cod sursa(job #896337)
#include<cstdio>
#include<cstring>
#define BIG 1<<30
#define MAX_SIZE 1005
#define GOOD 3
#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;
int result;
int q;
void read ( void )
{
fscanf(f,"%d%d",&N,&M);
fscanf(f,"%c",&ch);
for( int i(1); i <= N; ++i )
{
for( int ii(1); ii <= M ; ++ii)
{
fscanf(f,"%c",&ch);
b[i][ii]=BIG;
if(ch=='.')
continue;
if(ch == 'I' )
{
a[i][ii]=1;
start_i=i;
start_j=ii;
continue;
}
if(ch == '*' )
{
a[i][ii]=BIG;
continue;
}
if(ch == 'D' )
{
a[i][ii]=2;
b[i][ii]=0;
l_dr[++q]=i;
c_dr[q]=ii;
}
if(ch == 'O' )
{
a[i][ii]=3;
}
}
fscanf(f,"%c",&ch);
}
}
inline void mod ( void )
{
for(int i=0;i<=N+1;i++)
{
a[i][0]=a[i][M+1]=BIG;
b[i][0]=b[i][M+1]=0;
}
for(int i=0;i<=M+1;i++)
{
a[0][i]=a[N+1][i]=BIG;
b[0][i]=b[N+1][i]=0;
}
}
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[x][y]+1 < b[xnou][ynou] )
{
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;
if(b[start_i][start_j] < m)
return 0;
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] == 3 )
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;
}