Pagini recente » Cod sursa (job #984079) | Cod sursa (job #1910435) | Cod sursa (job #1886561) | Cod sursa (job #2194763) | Cod sursa (job #1154511)
#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, 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(i=1; i<=n; i++)
memset(v, 0, sizeof(v));
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]=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;
}
}
p=1, u=(n>m?n:m);
while(p<=u)
{
mid=(p+u)/2;
if(verifica(mid)==1)
u=mid-1;
else
p=mid+1;
}
g<<p-1<<"\n";
return 0;
}