Pagini recente » Cod sursa (job #878118) | Cod sursa (job #937361) | Cod sursa (job #390462) | Cod sursa (job #2750391) | Cod sursa (job #3168787)
#include <fstream>
#include <bitset>
#include <queue>
#define inf 2001
using namespace std;
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
bitset <1001> viz[1001],zid[1001][1001];
struct el
{
short int i,j;
};
queue <el> q;
char ch;
short int d,lv,cv,dx[]={0,1,-1,0,0},dy[]={0,0,0,1,-1};
short int l,c,xi,xf,yi,yf,n,m,i,j,st,mij,dr,dp[1001][1001];
bool f (short int val)
{
for (i=1; i<=n; i++)
{
for (j=1; j<=m; j++)
viz[i][j]=0;
}
if (dp[xi][yi]<val)
return 0;
viz[xi][yi]=1;
q.push ({xi,yi});
while (!q.empty ())
{
l=q.front ().i;
c=q.front ().j;
q.pop ();
for (d=1; d<=4; d++)
{
lv=l+dx[d];
cv=c+dy[d];
if (lv>0&&lv<=n&&cv>0&&cv<=m&&dp[lv][cv]>=val&&viz[lv][cv]==0&&zid[lv][cv]==0)
{
viz[lv][cv]=1;
q.push ({lv,cv});
}
}
}
return viz[xf][yf];
}
int main()
{
fin>>n>>m;
for (i=1; i<=n; i++)
{
for (j=1; j<=m; j++)
{
dp[i][j]=inf;
fin>>ch;
if (ch=='*')
zid[i][j]=1;
else if (ch=='D')
{
q.push ({i,j});
dp[i][j]=0;
}
else if (ch=='I')
{
xi=i;
yi=j;
}
else if (ch=='O')
{
xf=i;
yf=j;
}
}
}
while (!q.empty ())
{
l=q.front ().i;
c=q.front ().j;
q.pop ();
for (d=1; d<=4; d++)
{
lv=l+dx[d];
cv=c+dy[d];
if (lv>0&&lv<=n&&cv>0&&cv<=m&&dp[lv][cv]>dp[l][c]+1&&zid[lv][cv]==0)
{
dp[lv][cv]=dp[l][c]+1;
q.push ({lv,cv});
}
}
}
st=1;
dr=n+m;
while (st<=dr)
{
mij=(st+dr)/2;
if (f (mij)==1)
st=mij+1;
else
dr=mij-1;
}
if (dr==0)
dr--;
fout<<dr;
return 0;
}