Pagini recente » Cod sursa (job #3127252) | Cod sursa (job #1992200) | Cod sursa (job #1309790) | Cod sursa (job #2886762) | Cod sursa (job #2094586)
#include <fstream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
const int N = 1002, dx[] = {-1,0,1,0}, dy[] = {0,1,0,-1};
int mat[N][N];
short int n, m, cx[N*N], cy[N*N], xf, yf, xi, yi;
bool viz[N][N];
bool bun(int i, int j){
return (i > 0 && j > 0 && i <= n && j <= m);
}
void sterg(){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
viz[i][j] = false;
}
int BFS(int nr){
int st = 1, dr = nr, k, xc, yc, Max = 0;
while(st <= dr){
for(k=0;k<4;k++){
xc = cx[st] + dx[k];
yc = cy[st] + dy[k];
if(bun(xc,yc) && mat[xc][yc] == 0){
mat[xc][yc] = mat[cx[st]][cy[st]] + 1;
Max = max(Max, mat[xc][yc]);
cx[++dr] = xc;
cy[dr] = yc;
}
}
st++;
}
return Max;
}
bool BFS2(int dMax){
if(mat[xi][yi] <= dMax)
return false;
int st = 1, dr = 1, k, xc, yc;
sterg();
cx[1] = xi;
cy[1] = yi;
viz[xi][yi] = true;
while(st <= dr){
for(k=0;k<4;k++){
xc = cx[st] + dx[k];
yc = cy[st] + dy[k];
if(bun(xc,yc) && viz[xc][yc] == false && mat[xc][yc] > 1 && mat[xc][yc] > dMax){
viz[xc][yc] = true;
cx[++dr] = xc;
cy[dr] = yc;
}
}
st++;
}
return viz[xf][yf];
}
int solve(int Max){
int step = 1, dist;
for(;step < Max;step<<=1);
for(dist=0;step;step>>=1)
if(BFS2(dist + step))
dist += step;
return dist;
}
int main()
{
int dr = 0, Max, r;
char x;
in>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
in>>x;
if(x == 'I'){
xi = i;
yi = j;
}
else if(x == 'O'){
xf = i;
yf = j;
}
else if(x == '*')
mat[i][j] = -1;
else if(x == 'D'){
mat[i][j] = 1;
cx[++dr] = i;
cy[dr] = j;
}
}
in.close();
Max = BFS(dr);
if(mat[xf][yf] == 0)
out<<"-1\n";
else{
r = solve(Max);
if(r == 0)
out<<"-1\n";
else
out<<r<<"\n";
}
out.close();
return 0;
}