Pagini recente » Cod sursa (job #784710) | Cod sursa (job #2596697) | Cod sursa (job #1400251) | Cod sursa (job #1403202) | Cod sursa (job #2644565)
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
using i64 = long long;
using f64 = double;
using f80 = long double;
using pii = pair<int, int>;
using ptx = pair<f64, f64>;
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int v[1005][1005];
int r,c;
pii st,ex;
void border() {
for(int i=0;i<=r+1;i++){
v[i][0]=-1;
v[i][c+1]=-1;
}
for(int i=0;i<=c+1;i++){
v[0][i]=-1;
v[r+1][i]=-1;
}
}
bool cango(int n) {
queue<pii> q;
bitset<1000001> been;
q.push(st);
been[(st.x-1)*c+st.y]=1;
while(!q.empty()) {
pii now=q.front();
if(now.x==ex.x && now.y==ex.y)
return 1;
for(int i=0;i<4;i++) {
if(v[now.x+dx[i]][now.y+dy[i]]!=-1 && v[now.x+dx[i]][now.y+dy[i]]>=n && been[(now.x+dx[i]-1)*c+now.y+dy[i]]==0){
q.emplace(now.x+dx[i],now.y+dy[i]);
been[(now.x+dx[i]-1)*c+now.y+dy[i]]=1;
}
}
q.pop();
}
return 0;
}
int main() {
#ifdef HOME
freopen("dat.in", "r", stdin);
freopen("dat.out", "w", stdout);
#else
freopen("barbar.in", "r", stdin);
freopen("barbar.out", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin>>r>>c;
border();
char ch;
queue<pii> q;
for(int i=1;i<=r;i++) {
for(int j=1;j<=c;j++) {
cin>>ch;
switch(ch) {
case 'I':
st={i,j};
break;
case 'D':
q.emplace(i,j);
v[i][j]=-1;
break;
case '*':
v[i][j]=-1;
break;
case 'O':
ex={i,j};
break;
}
}
}
while(!q.empty()) {
pii now=q.front();
int nowVal=(v[now.x][now.y]==-1) ? 0 : v[now.x][now.y];
for(int i=0;i<4;i++) {
if(v[now.x+dx[i]][now.y+dy[i]]!=-1 && (v[now.x+dx[i]][now.y+dy[i]]>nowVal+1 || v[now.x+dx[i]][now.y+dy[i]]==0)) {
v[now.x+dx[i]][now.y+dy[i]]=nowVal+1;
q.emplace(now.x+dx[i],now.y+dy[i]);
}
}
q.pop();
}
int pas,pos=0;
for(pas=1<<10;pas>0;pas/=2) {
if(cango(pas+pos)) {
pos+=pas;
}
}
if(pos==0)
cout<<-1;
else
cout<<pos;
return 0;
}