Pagini recente » Cod sursa (job #2464054) | Cod sursa (job #2560775) | Cod sursa (job #804052) | Cod sursa (job #2795381) | Cod sursa (job #757404)
Cod sursa(job #757404)
#include<fstream>
#include<string.h>
#define MAX 1004
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
char c[MAX][MAX];
int v[MAX][MAX],i,j,k,n,c1[5660000][2],xi,yi,xf,yf,nrb,m;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
bool a[MAX][MAX];
void lee();
void cit();
void afis();
int cb();
int verifica(int);
void reset()
{
int i,j;
for(i=0;i<=n + 1;i++)
for(j=0;j<=m + 1;j++)
a[i][j]=0;
}
int verifica(int x)
{
int p=1,u=1,in,jn,i,j,k;
c[1][0]=xi;
c[1][1]=yi;
a[xi][yi]=true;
if(v[xi][yi] < x)
return 0;
while(p<=u )
{
i=c[p][0];
j=c[p][1];
for(k=0;k<4;k++)
{
in=i+dx[k];
jn=j+dy[k];
if(v[in][jn]>=x && in>0 && jn>0 && in<=n && jn<=m && a[in][jn]==0 && c[in][jn] != '*')
{
a[in][jn]=true;
u++;
c[u][0]=in;
c[u][1]=jn;
if(c[in][jn]=='O')
{
reset();
return 1;
}
}
}
p++;
}
reset();
return 0;
}
int cb()
{
int p=0,u=10000000,step, i = 0;;
for(step = 1 ; step <= u ;step <<= 1 );
for(i = 0 ; step ; step >>= 1)
if(verifica(i + step) )
i +=step;
if(!verifica(i))
return -1;
return i;
}
void cit()
{
int i,j;
fin>>n>>m;
for(i=1;i<=n;i++)
{
fin >> c[i] + 1;
//fin.get();
//fin.get(c[i],1009,'\n');
//fout<<c[i][m]<<'\n';
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(c[i][j]=='I')
{
xi=i;
yi=j;
}
if(c[i][j]=='O')
{
xf=i;yf=j;
}
if(c[i][j]=='D')
{
c1[++nrb][0]=i;
c1[nrb][1]=j;
//fout<<i<<" "<<j<<'\n';
}
}
afis();
lee();
// for(i = 1 ;i <= n; i++)
// {
// for(j = 1; j <=m; j++)
// fout << v[i][j] <<" ";
// fout<<'\n';
// }
fout << cb();
//fout<<cb();
//else
// fout<<-1;
//fout<<verifica(2);
}
void lee()
{
int u=1,p=1,i,j,in,jn,k;
u=nrb;
while(p<=u)
{
i=c1[p][0];
j=c1[p][1];
for(k=0;k<4;k++)
{
in=i+dx[k];
jn=j+dy[k];
if(c[in][jn]!='*'&&in>0&&jn>0 && in<=n&& jn<=m &&v[in][jn]==0)
{
u++;
c1[u][0]=in;
c1[u][1]=jn;
v[in][jn]=v[i][j]+1;
}
}
p++;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(c[i][j]== 'D')
v[i][j] = 0;
//fout<<v[i][j] <<" ";
}
//fout<<'\n';
}
}
void afis()
{
int i,j;
for(i=0;i<=n;i++)
{
for(j=0;j<=m;j++)
{
v[i][j]=0;
//fout<<v[i][j]<<" ";
}
//fout<<'\n';
}
}
int main()
{
cit();
fin.close();
return 0;
}