Pagini recente » Cod sursa (job #690469) | Cod sursa (job #82864) | Monitorul de evaluare | Cod sursa (job #2103274) | Cod sursa (job #3327697)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct AA{
int l,c;
};
const int di[4]={-1,0,1,0}, dj[4]={0,1,0,-1};
int n, m, d[1002][1002], ls, cs, lf, cf;
bool fr[1002][1002], obstacle[1002][1002];
queue<AA> coada;
bool interior(int l,int c){
return l>0&&c>0&&l<=n&&c<=m;
}
void Constr_dist(){
AA varf;
int k, l ,c;
while(!coada.empty()){
varf = coada.front();
coada.pop();
for(k=0;k<4;k++){
l = varf.l + di[k];
c = varf.c + dj[k];
if(interior(l,c) && d[l][c] > d[varf.l][varf.c] + 1){
d[l][c] = d[varf.l][varf.c] + 1;
coada.push({l,c});
}
}
}
}
bool Posibil(int p){
if(d[ls][cs] < p)
return false;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
fr[i][j] = false;
while(!coada.empty())
coada.pop();
fr[ls][cs] = true;
coada.push({ls,cs});
AA varf;
int k, l ,c;
while(!coada.empty()){
varf = coada.front();
coada.pop();
if(varf.l == lf && varf.c == cf)
return true;
for(k=0;k<4;k++){
l = varf.l + di[k];
c = varf.c + dj[k];
if(interior(l,c) && !fr[l][c] && !obstacle[l][c] && d[l][c] >= p){
fr[l][c] = true;
coada.push({l,c});
}
}
}
return false;
}
int main(){
int i, j;
char c;
fin >> n >> m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
d[i][j] = 1e9;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
fin >> c;
if(c == 'D'){
coada.push({i,j});
d[i][j] = 1;
obstacle[i][j] = false;
}
else if(c == 'I'){
ls = i;
cs = j;
obstacle[i][j] = false;
}
else if(c == 'O'){
lf = i;
cf = j;
obstacle[i][j] = false;
}
else if(c == '*'){
obstacle[i][j] = true;
}
else if(c == '.'){
obstacle[i][j] = false;
}
}
}
Constr_dist();
if(obstacle[ls][cs] || obstacle[lf][cf]){
fout << -1;
return 0;
}
int st=1, dr=n*m, mij, ans=-1;
while(st<=dr){
mij = (st+dr)/2;
if(Posibil(mij)){
ans = mij;
st = mij+1;
}
else{
dr = mij-1;
}
}
if(ans == -1)
fout << -1;
else
fout << ans-1;
return 0;
}