Pagini recente » Cod sursa (job #1331937) | Cod sursa (job #2744869) | Cod sursa (job #758856) | Cod sursa (job #2335932) | Cod sursa (job #2971471)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,a[1010][1010],d[1010][1010],st,dr,xi,yi,xf,yf,dx[]={1,-1,0,0},dy[]={0,0,-1,1},viz[1010][1010];
char x[1010];
struct numar
{
int x,y;
}q[1000010];
int drum(int p)
{
st=1,dr=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
viz[i][j]=0;
}
viz[xi][yi]=1;
if(d[xi][yi]<p)
return 0;
q[dr]={xi,yi};
while(st<=dr)
{
for(int k=0;k<=3;k++)
{
int x=q[st].x+dx[k];
int y=q[st].y+dy[k];
if(x>=1 && x<=n && y>=1 && y<=m && viz[x][y]==0 && a[x][y]==0 && d[x][y]>p)
{
viz[x][y]=1;
q[++dr]={x,y};
}
}
st++;
}
if(viz[xf][yf]==1)
return 1;
return 0;
}
int main()
{
fin>>n>>m;
fin.get();
for(int i=1;i<=n;i++)
{
fin.getline(x,sizeof(x));
for(int j=0;j<m;j++)
{
if(x[j]=='D')
{
a[i][j+1]=2;
dr++;
q[dr]={i,j+1};
d[i][j+1]=1;
}
else if(x[j]=='*')
a[i][j+1]=1;
if(x[j]=='I')
xi=i,yi=j+1;
if(x[j]=='O')
xf=i,yf=j+1;
}
}
st=1;
while(st<=dr)
{
for(int p=0;p<=3;p++)
{
int x=q[st].x+dx[p];
int y=q[st].y+dy[p];
if(x>=1 && x<=n && y>=1 && y<=m && d[x][y]==0 && a[x][y]==0)
{
q[++dr]={x,y};
d[x][y]=d[q[st].x][q[st].y]+1;
}
}
st++;
}
int ss1=1,dd1=10000000,mid=0,poz=0;
while(ss1<=dd1)
{
mid=(ss1+dd1)/2;
if(drum(mid)==1)
{
poz=mid;
ss1=mid+1;
}
else
{
dd1=mid-1;
}
}
fout<<poz;
return 0;
}