Pagini recente » Cod sursa (job #1430548) | Cod sursa (job #260742) | Cod sursa (job #3194630) | Cod sursa (job #2899932) | Cod sursa (job #2703451)
#include <bits/stdc++.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
struct wow
{
int x,y;
}acum,b,start,sfarsit;
int dl[]={1,-1,0,0};
int dc[]={0,0,1,-1};
queue <wow> q;
char ch;
int n,m,i,j,v[1005][1005],sol;
bool interior (wow a)
{
if (1<=a.x&&a.x<=n&&1<=a.y&&a.y<=m)
{
return 1;
}
return 0;
}
int ok[1005][1005];
bool verif (int dist)
{
if (v[start.x][start.y]<dist)
{
return 0;
}
queue <wow> q1;
q1.push(start);
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
if (ok[i][j]!=-1)
{
ok[i][j]=0;
}
}
}
ok[start.x][start.y]=1;
while (!q1.empty()&&ok[sfarsit.x][sfarsit.y]==0)
{
acum=q1.front();
q1.pop();
for (i=0;i<4;i++)
{
b.x=acum.x+dl[i];
b.y=acum.y+dc[i];
if (interior(b)==1&&v[b.x][b.y]>=dist&&ok[b.x][b.y]==0)
{
ok[b.x][b.y]=1;
q1.push(b);
}
}
}
if (ok[sfarsit.x][sfarsit.y]==1)
{
return 1;
}
return 0;
}
void afis (int v[1005][1005])
{
int i,j;
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
g<<v[i][j]<<" ";
}
g<<'\n';
}
}
int st,dr,mij;
int main()
{
f>>n>>m;
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
if (v[i][j]!=-1)
{
v[i][j]=1e9;
}
}
}
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
f>>ch;
if (ch=='D')
{
q.push(wow{i,j});
v[i][j]=0;
}
else
if (ch=='I')
{
start=wow{i,j};
}
else
if (ch=='O')
{
sfarsit=wow{i,j};
}
else
if (ch=='*')
{
ok[i][j]=-1;
}
}
}
while (!q.empty())
{
acum=q.front();
q.pop();
for (i=0;i<4;i++)
{
b.x=acum.x+dl[i];
b.y=acum.y+dc[i];
if (v[b.x][b.y]!=-1&&v[b.x][b.y]>v[acum.x][acum.y]+1)
{
v[b.x][b.y]=v[acum.x][acum.y]+1;
q.push(b);
}
}
}
int ok1=0;
st=0;
dr=n*m;
while (st<=dr)
{
mij=(st+dr)/2;
if (verif(mij)==1)
{
sol=mij;
ok1=1;
st=mij+1;
}
else
{
dr=mij-1;
}
}
if (ok1==0)
{
g<<"-1";
return 0;
}
g<<sol;
return 0;
}