Pagini recente » Cod sursa (job #371619) | Cod sursa (job #3214842) | Cod sursa (job #526502) | Cod sursa (job #2810517) | Cod sursa (job #2646919)
#include <bits/stdc++.h>
using namespace std;
#define NMAX 1005
int n,m,mat2[NMAX][NMAX], viz[NMAX][NMAX], lg, cnt;
char mat[NMAX][NMAX];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
pair<int,int> Q[NMAX*NMAX], Q2[NMAX*NMAX];
int sx,sy,fx,fy,lg3;
int OK(int x){
cnt++;
lg = 0;
Q[++lg] = {sx,sy};
viz[sx][sy] = cnt;
if (mat2[sx][sy]==-1 || mat2[sx][sy] <= x + 1 || mat2[fx][fy] == -1 || mat2[fx][fy] <= x + 1) return 0;
for (int i=1;i<=lg;i++){
for (int k=0;k<4;k++){
int X = Q[i].first + dx[k];
int Y = Q[i].second + dy[k];
if (viz[X][Y] == cnt || mat2[X][Y] == -1 || mat2[X][Y] <= x + 1) continue;
viz[X][Y] = cnt;
Q[++lg] = {X,Y};
if (X == fx && Y == fy){
return 1;
}
}
}
return 0;
}
int main()
{
cin.sync_with_stdio(false);
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
cin >> n >> m;
for (int i=1;i<=n;i++){
cin >> mat[i] + 1;
}
for (int i=1;i<=n;i++) mat2[i][0] = mat2[i][m+1] = -1;
for (int i=1;i<=m;i++) mat2[0][i] = mat2[n+1][i] = -1;
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
mat2[i][j] = 0;
if (mat[i][j] == '*')
mat2[i][j] = -1;
else if (mat[i][j] == 'I'){
sx = i;
sy = j;
}
else if (mat[i][j] == 'O'){
fx = i;
fy = j;
}
else if (mat[i][j] == 'D'){
Q2[++lg] = {i,j};
mat2[i][j] = 1;
}
}
}
for (int i=1;i<=lg;i++){
pair<int, int> crt = Q2[i];
for (int k=0;k<4;k++){
int X = crt.first + dx[k];
int Y = crt.second + dy[k];
if (mat2[X][Y] != 0) continue;
mat2[X][Y] = mat2[crt.first][crt.second] + 1;
Q2[++lg] = {X,Y};
}
}
int st = 0, p = 1;
for (;p<=max(n,m);p<<=1);
for (;p>=1;p>>=1){
if(st + p <= max(n,m) && OK(st + p))
st += p;
}
if (!OK(st)){
cout << -1 << '\n';
}
else{
cout << st+1 << '\n';
}
return 0;
}