Pagini recente » Cod sursa (job #3254320) | Cod sursa (job #550305) | Cod sursa (job #1022482) | Cod sursa (job #2355062) | Cod sursa (job #3327513)
#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], mat[1002][1002], ls, cs, lf, cf, fr[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, aux;
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){
while(!coada.empty())
coada.pop();
if(d[ls][cs] >= p)
coada.push({ls,cs});
fr[ls][cs]=1;
AA varf, aux;
int k, l ,c;
while(!coada.empty()){
varf = coada.front();
coada.pop();
// if(p == 6)
// fout << " " << varf.l << " " << varf.c << '\n';
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) && d[l][c] >= p && !fr[l][c]){
fr[l][c] = 1;
coada.push({l,c});
}
}
}
return false;
}
int main(){
int i, j;
char c;
fin >> n >> m;
for(i=0;i<=n;i++)
mat[i][0] = mat[i][m+1] = 1;
for(i=1;i<=m;i++)
mat[0][i] = mat[n+1][i] = 1;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
d[i][j] = 1e9;
fin >> c;
if(c == '.')
mat[i][j] = 0;
if(c == '*')
mat[i][j] = 1;
if(c == 'D'){
coada.push({i,j});
d[i][j] = 1;
}
if(c == 'I'){
ls = i;
cs = i;
}
if(c == 'O'){
lf = i;
cf = i;
}
}
}
Constr_dist();
// for(i=1;i<=n;i++,fout<<endl)
// for(j=1;j<=m;j++)
// fout << d[i][j] << " ";
int st=1, dr=n*m, mij, ans=-1;
while(st<=dr){
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
fr[i][j] = 0;
mij = (st+dr)/2;
//fout << mij << endl;
if(Posibil(mij)){
ans = mij;
st=mij+1; /// asa ramane
}
else
dr=mij-1;
}
if(ans == -1)
fout << -1;
else
fout << ans-1;
}