Pagini recente » Cod sursa (job #15115) | Cod sursa (job #1138909) | Cod sursa (job #1888156) | Cod sursa (job #2831418) | Cod sursa (job #3239162)
#include <bits/stdc++.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n, m, i, j, a[1005][1005], d[1005][1005], viz[1005][1005], x, y, x2, y2, i2, j2, ans;
char c[1005];
int vx[] = {-1, 0, 1, 0};
int vy[] = {0, -1, 0, 1};
queue< pair<int, int> > q;
bool ok(int i, int j)
{
return i>=1 && i<=n && j>=1 && j<=m;
}
void rezolva(int i2, int j2, int val)
{
int iaux, jaux;
viz[i2][j2]=1;
for(int i=0; i<4; ++i)
{
iaux = i2 + vx[i];
jaux = j2 + vy[i];
if(ok(iaux, jaux) && a[iaux][jaux]==0 && viz[iaux][jaux]==0 && d[iaux][jaux]-1 >= val)
rezolva(iaux, jaux, val);
}
}
int main()
{
f>>n>>m;
f.get();
for(i=1; i<=n; ++i)
{
f.getline(c, 1005);
for(j=0; j<strlen(c); ++j)
{
if(c[j]=='.') a[i][j+1]=0;
if(c[j]=='*') a[i][j+1]=1;
if(c[j]=='I')
{
a[i][j+1]=0; x=i; y=j+1;
}
if(c[j]=='O')
{
a[i][j+1]=0; x2=i; y2=j+1;
}
if(c[j]=='D')
{
a[i][j+1]=1; d[i][j+1]=1;
q.push( make_pair(i, j+1) );
}
}
}
//matricea de distante
while(!q.empty())
{
i2 = q.front().first;
j2 = q.front().second;
int iaux, jaux;
for(i=0; i<4; ++i)
{
iaux = i2 + vx[i];
jaux = j2 + vy[i];
if(a[iaux][jaux]==0 && d[iaux][jaux]==0)
{
q.push(make_pair(iaux, jaux));
d[iaux][jaux] = d[i2][j2]+1;
}
}
q.pop();
}
//cautare binara
ans=-1;
int st=1, dr=n+m, mij;
while(st<=dr)
{
mij=(st+dr)/2;
rezolva(x, y, mij);
if(viz[x2][y2]==1)
{
ans=mij;
st=mij+1;
}
else dr=mij-1;
for(i=1; i<=n; ++i)
for(j=1; j<=m; ++j) viz[i][j]=0;
}
g<<ans;
return 0;
}