Pagini recente » Cod sursa (job #2702779) | Cod sursa (job #1166031) | Cod sursa (job #1926072) | Cod sursa (job #1410868) | Cod sursa (job #1363677)
#include <fstream>
using namespace std;
const int N=1000;
int mat[N+5][N+5],n,m,x1,x2,y1,y2;
int f[N+5][N+5];
struct poz
{
int x;
int y;
};
poz v[N*N];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int intem(int x,int y)
{
if(x>=1 && y<=m && x<=n && y>=1)
return 1;
else
return 0;
}
void lee(int u)
{
int p=1,k,x,y;
while(p<=u)
{
for(k=0;k<=3;k++)
{
x=v[p].x+dx[k];
y=v[p].y+dy[k];
if(intem(x,y)==1 && mat[x][y]==0)
{
mat[x][y]=mat[v[p].x][v[p].y]+1;
u++;
v[u].x=x;
v[u].y=y;
}
}
p++;
}
}
int min(int a,int b)
{
if(a<=b)
return a;
else
return b;
}
int fil(int d,int x,int y)
{
int i,j,k,ok=0;
f[x][y]=1;
for(k=0;k<=3;k++)
{
i=x+dx[k];
j=y+dy[k];
if(intem(i,j)==1 && f[i][j]==0 && mat[i][j]!=-1)
{
if(mat[i][j]>=d)
fil(d,i,j);
}
}
if(mat[x1][y1]<d || mat[x2][y2]<d)
return 0;
else
{
return f[x2][y2];
}
}
void cler()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
f[i][j]=0;
}
int cautbin()
{
int pas=1<<11,d=0;
while(pas>min(n,m))
pas=pas/2;
while(pas>=1)
{
cler();
if(fil(d+pas,x1,y1)==1)
d=d+pas;
pas=pas/2;
}
return d;
}
int main()
{
ifstream in("barbar.in");
ofstream out("barbar.out");
int i,j,fin=0,d;
char c;
in>>n>>m>>ws;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
in>>c>>ws;
if(c=='*')
mat[i][j]=-1;
if(c=='I')
{
x1=i;
y1=j;
}
if(c=='O')
{
x2=i;
y2=j;
}
if(c=='D')
{
fin++;
v[fin].x=i;
v[fin].y=j;
mat[i][j]=1;
}
}
lee(fin);
d=cautbin();
out<<d-1;
return 0;
}