Pagini recente » Statistici Gontescu Maria Ruxandra (Ruxi_Gontescu) | Cod sursa (job #2512034) | Cod sursa (job #471263) | Cod sursa (job #1713802) | Cod sursa (job #1154575)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n, m, a[1010][1010], i, j, xi, yi, xf, yf, x, y, k, st, dr, mid, d[1010][1010], c[2][1000010], p, u, xa, ya, v[1010][1010];
char s[1010];
int dx[4]={-1, 0, 0, 1};
int dy[4]={0, -1, 1, 0};
void marcare(int x, int y){
d[x][y]=1;
p=u=1;
c[0][p]=x;
c[1][p]=y;
while(p<=u)
{
x=c[0][p];
y=c[1][p];
for(int D=0; D<4; D++)
{
xa=x+dx[D];
ya=y+dy[D];
if(xa>0 && xa<=n && ya>0 && ya<=m && a[xa][ya]!=4)
{
if(d[xa][ya]==0 || d[xa][ya]>d[x][y]+1)
{
d[xa][ya]=d[x][y]+1;
u++;
c[0][u]=xa;
c[1][u]=ya;
}
}
}
p++;
}
}
int verifica(int l){
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
v[i][j]=0;
if(d[xi][yi]<l)
return 0;
v[xi][yi]=1;
c[0][1]=xi;
c[1][1]=yi;
int p=u=1;
while(p<=u)
{
x=c[0][p];
y=c[1][p];
for(int D=0; D<4; D++)
{
xa=x+dx[D];
ya=y+dy[D];
if(xa>0 && xa<=n && ya>0 && ya<=m && a[xa][ya]!=4 && d[xa][ya]>=l && v[xa][ya]==0)
{
if(xa==xf && ya==yf)
return 1;
v[xa][ya]=v[x][y]+1;
u++;
c[0][u]=xa;
c[1][u]=ya;
}
}
p++;
}
return 0;
}
int main(){
f>>n>>m;
for(i=1; i<=n; i++)
{
f.get();
f.get(s+1, 1010);
for(j=1; j<=m; j++)
if(s[j]=='I')
{
a[i][j]=1;
xi=i;
yi=j;
}
else if(s[j]=='D')
marcare(i, j);
else if(s[j]=='*')
a[i][j]=4;
else if(s[j]=='O')
{
a[i][j]=2;
xf=i;
yf=j;
}
}
st=1, dr=(n>m?n:m);
while(st<=dr)
{
mid=(st+dr)/2;
if(verifica(mid)==0)
dr=mid-1;
else
st=mid+1;
}
if(verifica(dr)==1)
g<<dr-1<<"\n";
else
g<<"-1\n";
return 0;
}