Pagini recente » Cod sursa (job #987154) | Cod sursa (job #1526883) | Cod sursa (job #1737583) | Cod sursa (job #2941664) | Cod sursa (job #2955543)
#include <fstream>
#include <queue>
#include <climits>
#include <cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct poz
{
int x;
int y;
} st,fi;
queue <poz> q;
int v[1005][1005];
int marc[1005][1005];
int n,m;
int drmat[1005][1005];
bool inmat(int i,int j)
{
return i>=1 && i<=n && j>=1 && j<=m;
}
int dx[]= {1,-1,0,0};
int dy[]= {0,0,-1,1};
bool drum(int min_val)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
drmat[i][j]=false;
}
}
q.push(st);
drmat[st.x][st.y]=true;
while(!q.empty())
{
for(int d=0; d<=3; d++)
{
int l = q.front().x + dx[d];
int c = q.front().y + dy[d];
if(!inmat(l,c) || drmat[l][c] || marc[l][c]<min_val)
continue;
q.push({l,c});
drmat[l][c]=1;
}
q.pop();
}
return drmat[fi.x][fi.y];
}
void b_s()
{
int st=1;
int dr=1000000000;
int val=-1;
while(st<=dr)
{
int mid=(st+dr)/2;
if(drum(mid))
{
st=mid+1;
val=mid;
}
else
dr=mid-1;
}
fout<<val;
}
int main()
{
fin>>n>>m;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
char x;
fin>>x;
if(x=='I')
{
st.x=i;
st.y=j;
}
else if (x=='O')
{
fi.x=i;
fi.y=j;
}
else if (x=='D')
{
q.push({i,j});
marc[i][j]=1;
}
else if (x=='*')
{
marc[i][j]=-1;
}
}
}
while(!q.empty())
{
int x = q.front().x;
int y = q.front().y;
for(int d=0; d<=3; d++)
{
int l = dx[d]+x;
int c = dy[d]+y;
if(!inmat(l,c))
continue;
if(marc[l][c]==0)
{
marc[l][c]=marc[x][y]+1;
q.push({l,c});
}
}
q.pop();
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
marc[i][j]--;
}
}
b_s();
}