Pagini recente » Cod sursa (job #1034546) | Cod sursa (job #1236443) | Cod sursa (job #755614) | Cod sursa (job #1560048) | Cod sursa (job #2055447)
#include <fstream>
#define DIM 1010
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int f[1002][1002],x[1000001],y[1000001],x1,y1,x2,y2,n,m,drag;
int cx[1000001],cy[1000001];
char v[1015];
int dx[4]={-1,0,+1,0};
int dy[4]={0,+1,0,-1};
int lee(int k)
{
int z,i,j,fl,p,u,nr,uc;
fl=1;
for(z=1; z<=drag && fl && k; z++)
{
p=u=1;
cx[1]=x[z];
cy[1]=y[z];
f[x[z]][y[z]]=2;
nr=k-1;
while(nr && fl && p<=u)
{
uc=u;
for(i=p; i<=u && fl; i++)
for(j=0; j<4 && fl; j++)
if(f[cx[i]+dx[j]][cy[i]+dy[j]]==0)
if(cx[i]+dx[j]==x1 && cy[i]+dy[j]==y1)
fl=0;
else
uc++,cx[uc]=cx[i]+dx[j],cy[uc]=cy[i]+dy[j],f[cx[uc]][cy[uc]]=2;
p=u+1;
u=uc;
nr--;
}
}
if(fl==0)
{
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
if(f[i][j]==2)
f[i][j]=0;
return 0;
}
f[x1][y1]=3;
p=u=1;
cx[p]=x1;
cy[p]=y1;
while(p<=u)
{
for(i=0; i<4; i++)
if(f[cx[p]+dx[i]][cy[p]+dy[i]]==0)
u++,cx[u]=cx[p]+dx[i],cy[u]=cy[p]+dy[i],f[cx[u]][cy[u]]=3;
p++;
}
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
if(f[i][j]==2)
f[i][j]=0;
if(f[x2][y2]==3)
return 1;
return 0;
}
int main()
{
int i,j,pas,rez;
fin >> n >> m;
fin.get();
drag=0;
for(i=1; i<=n; i++){
fin.getline(v + 1, DIM);
for(j=1; j<=m; j++)
switch(v[j-1])
{
case 'I': x1=i,y1=j; break;
case '0': x2=i,y2=j; break;
case 'O': x2=i,y2=j; break;
case '*': f[i][j]=1; break;
case 'D': drag++; x[drag]=i,y[drag]=j; break;
default: break;
}
}
for(i=0; i<=n+1; i++)
f[i][0]=f[i][m+1]=1;
for(i=0; i<=m+1; i++)
f[0][i]=f[n+1][i]=1;
pas=1<<11;
rez=0;
while(pas)
{
if(lee(rez+pas))
rez+=pas;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
if(f[i][j]==3)
f[i][j]=0;
pas/=2;
}
if(rez==0)
{
rez=lee(0);
rez--;
}
fout<<rez<<"\n";
return 0;
}