Pagini recente » Cod sursa (job #2946176) | Cod sursa (job #281001) | Cod sursa (job #2967923) | Cod sursa (job #1060671) | Cod sursa (job #2323140)
#include<fstream>
#include<queue>
using namespace std;
ifstream fi("barbar.in");
ofstream fo("barbar.out");
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int n,m,i,j,xf,yf,xs,ys,Bp[1005][1005],A[1005][1005],D[1005][1005],rez;
deque<pair<int,int> > Q;
pair<int,int> vf;
char S[1005];
bool check(int dist)
{
int i,j;
if(D[xs][ys]<=dist)
return 0;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
A[i][j]=0;
A[xs][ys]=1;
Q.push_back({xs,ys});
while(!Q.empty())
{
vf=Q.front();
Q.pop_front();
for(int d=0; d<4; d++)
{
if(Bp[vf.first+dx[d]][vf.second+dy[d]]!=-1 && D[vf.first+dx[d]][vf.second+dy[d]]>dist && A[vf.first+dx[d]][vf.second+dy[d]]==0)
{
A[vf.first+dx[d]][vf.second+dy[d]]=1;
Q.push_back({vf.first+dx[d],vf.second+dy[d]});
}
}
}
return A[xf][yf];
}
int main()
{
fi>>n>>m;
for(i=1; i<=n; i++)
{
fi>>S;
for(j=1; j<=m; j++)
{
if(S[j-1]=='I')
{
xf=i;
yf=j;
}
if(S[j-1]=='D')
{
Q.push_back({i,j});
D[i][j]=1;
}
if(S[j-1]=='O')
{
xs=i;
ys=j;
}
if(S[j-1]=='*')
Bp[i][j]=-1;
}
}
for(i=1; i<=n; i++)
Bp[i][0]=Bp[i][m+1]=-1;
for(j=1; j<=m; j++)
Bp[0][j]=Bp[n+1][j]=-1;
while(!Q.empty())
{
vf=Q.front();
Q.pop_front();
for(int d=0; d<4; d++)
{
if(Bp[vf.first+dx[d]][vf.second+dy[d]]!=-1 && D[vf.first+dx[d]][vf.second+dy[d]]==0)
{
D[vf.first+dx[d]][vf.second+dy[d]]=1+D[vf.first][vf.second];
Q.push_back({vf.first+dx[d],vf.second+dy[d]});
}
}
}
rez=0;
for(i=11; i>=0; i--)
if(check(rez+(1<<i)))
rez=rez+(1<<i);
if(rez==0 && !check(0))
fo<<"-1";
else
fo<<rez<<"\n";
fi.close();
fo.close();
return 0;
}