Pagini recente » Cod sursa (job #922927) | Cod sursa (job #3266984) | Cod sursa (job #227642) | Cod sursa (job #1100166) | Cod sursa (job #2640660)
#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}};
while(!DII.empty()){
ii acum = DII.front();DII.pop_front();
V[acum.first][acum.second]=1;int pepe = A[acum.first][acum.second];
for(auto it:P){
int 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 xs,ys,xf,yf;
int dfs(int a,int b,int c)
{
V[a][b]=1;
ii P[] = {{1,0},{-1,0},{0,1},{0,-1}};
for(auto it:P){
int 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;
}