Pagini recente » Cod sursa (job #1742489) | Cod sursa (job #2137136) | Cod sursa (job #1934471) | Cod sursa (job #1361208) | Cod sursa (job #2971453)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct poz{
int x;
int y;}start_,exit_;
queue <poz> q;
int n,m;
int dp[1005][1005];
int v[1005][1005];
bool marc[1005][1005];
int dx[]={1,-1,0,0};
int dy[]={0,0,-1,1};
inline bool inmat(int i,int j)
{
return i>=1 && i<=n && j>=1 && j<=m;
}
bool sol(int val)
{
q.push(start_);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
marc[i][j]=false;
}
}
while(!q.empty())
{
poz fr = q.front();
q.pop();
for(int d=0;d<=3;d++)
{
int l = fr.x+dx[d];
int c = fr.y+dy[d];
if(inmat(l,c) && !v[l][c] && dp[l][c]>val && marc[l][c]==false)
{
q.push({l,c});
marc[l][c]=true;
}
}
}
return marc[exit_.x][exit_.y];
}
void bins()
{
int st=1;
int dr=n*m+1;
int rez=-1;
while(st<=dr)
{
int mid = (st+dr)/2;
if(sol(mid))
{
rez=mid;
st=mid+1;
}
else
dr=mid-1;
}
fout<<rez;
return;
}
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=='D'){
q.push({i,j});
dp[i][j]=1;
}
else if (x=='*')
{
v[i][j]=1;
}
else if (x=='I')
{
start_.x=i;
start_.y=j;
}
else if (x=='O')
{
exit_.x=i;
exit_.y=j;
}
}
}
while(!q.empty())
{
poz fr = q.front();
q.pop();
for(int d=0;d<=3;d++)
{
int l = dx[d]+fr.x;
int c = dy[d]+fr.y;
if(inmat(l,c) && !v[l][c] && !dp[l][c])
{
dp[l][c]=dp[fr.x][fr.y]+1;
q.push({l,c});
}
}
}
bins();
}