Pagini recente » Cod sursa (job #1377533) | Cod sursa (job #377216) | Cod sursa (job #1217035) | Cod sursa (job #1354951) | Cod sursa (job #2664025)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("barbar.in");
ofstream g ("barbar.out");
int n,m;
int mt[1005][1005];
int dragon[1005][1005];
int i1,j1,i2,j2;
queue <pair<int , int>> Q;
int di[4]= {0,0,1,-1};
int dj[4]= {1,-1,0,0};
int okD(int i, int j)
{
if(i<1 || j<1 || i>n || j>m)
return 0;
if(dragon[i][j]!=0)
return 0;
return 1;
}
void LeeD()
{
while(!Q.empty())
{
int i=Q.front().first;
int j=Q.front().second;
for(int x=0; x<4; ++x)
if(okD(i+di[x], j+dj[x]))
{
Q.push({i+di[x], j+dj[x]});
dragon[i+di[x]][j+dj[x]]=dragon[i][j]+1;
}
Q.pop();
}
}
int ok(int i, int j, int k )
{
if(i<1 || j<1 || i>n || j>m)
return 0;
if(dragon[i][j]<=k || mt[i][j]!=0)
return 0;
return 1;
}
int Lee(int ap)
{
while(!Q.empty())
Q.pop();
Q.push({i1,j1});
while(!Q.empty())
{
int i=Q.front().first;
int j=Q.front().second;
if(i==i2 && j==j2)
return 1;
for(int x=0; x<4; ++x)
{
if(ok(i+di[x] , j+dj[x] , ap))
{
Q.push({i+di[x] , j+dj[x]});
mt[i+di[x]][j+dj[x]]=1;
}
}
Q.pop();
}
return 0;
}
int main()
{
char c;
f>>n>>m;
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
{
f>>c;
if(c=='I')
{
i1=i;
j1=j;
}
if(c=='O')
{
i2=i;
j2=j;
}
if(c=='*')
mt[i][j]=-1;
if(c=='D')
{
Q.push({i,j});
dragon[i][j]=1;
}
}
}
LeeD();
int st=1;
int dr=2*n;
int mij=(st+dr)/2;
int raspuns=-1;
while(st<=dr)
{
if(Lee(mij))
{
raspuns=mij;
st=mij+1;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
if(mt[i][j]==1)
mt[i][j]=0;
}
else
dr=mij-1;
mij=(st+dr)/2;
}
g<<raspuns;
return 0;
}