Pagini recente » Cod sursa (job #2096309) | Cod sursa (job #2171124) | Cod sursa (job #212140) | Cod sursa (job #2377796) | Cod sursa (job #2640661)
#include <bits/stdc++.h>
#define SSTR( x ) static_cast< std::ostringstream & >( \
( std::ostringstream() << std::dec << x ) ).str()
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef vector<pair<int,int> > vii;
deque<ii> DII;
ifstream fi("barbar.in");
ofstream fo("barbar.out");
int n,m,nr_dr,A[1005][1005];
bitset<1005> V[1005];
char S[1005][1005];
void bfs()
{
ii P[] = {{1,0},{-1,0},{0,1},{0,-1}};
int x,y;ii acum;
while(!DII.empty()){
acum = DII.front();DII.pop_front();
V[acum.first][acum.second]=1;int pepe = A[acum.first][acum.second];
for(auto it:P){
x=acum.first+it.first;y=acum.second+it.second;
if(!V[x][y] && (x&&y&&(x<=n)&&(y<=n))&& S[x][y] !='*' && S[x][y] !='D'){
V[x][y]=1;
A[x][y]=1+pepe;
DII.push_back({x,y});
}
}
}
}
int x,y,xs,ys,xf,yf;ii P[] = {{1,0},{-1,0},{0,1},{0,-1}};
int dfs(int a,int b,int c)
{
V[a][b]=1;
for(auto it:P){
x=a+it.first;y=b+it.second;
if(!V[x][y] && (x&&y&&(x<=n)&&(y<=n)) && A[x][y]>=c){
dfs(x,y,c);
}
}
}
int ok(int x)
{
for(int i=1;i<=1000;i++)
for(int j=1;j<=1000;j++)
V[i][j]=0;
dfs(xs,ys,x);
return V[xf][yf];
}
void bin()
{
int st=1,dr=2*n+5,mij;
if(!ok(1)){fo<<-1;return;}
while(st<dr){
mij=(st+dr+1)/2;
if(ok(mij)){
st=mij;
}
else dr=mij-1;
}
fo<<st;
}
int main()
{
///cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
fi>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
fi>>S[i][j];
if(S[i][j]=='D'){
A[i][j]=0;
DII.push_back({i,j});
}
if(S[i][j]=='I'){
xs=i;ys=j;
}
if(S[i][j]=='O'){
xf=i;yf=j;
}
}
}
bfs();
bin();
return 0;
}