Pagini recente » Cod sursa (job #1190447) | Cod sursa (job #2314531) | Cod sursa (job #331220) | Cod sursa (job #1398375) | Cod sursa (job #3327503)
#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, int l,int c){
//fout << l << " " << c << '\n';
fr[l][c] = 1;
if(l == lf && c == cf)
return true;
int h = 0;
for(int k=0;k<4;k++){
if(fr[l+di[k]][c+dj[k]]==0 && mat[l+di[k]][c+dj[k]] == 0 && d[l+di[k]][c+dj[k]] >= p)
h += Posibil(p,l+di[k],c+dj[k]);
}
return h;
}
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, 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, ls, cs)){
ans = mij;
st=mij+1;
}
else
dr=mij-1;
}
if(ans == -1)
fout << -1;
else
fout << ans-1;
}