Pagini recente » Cod sursa (job #2192016) | Monitorul de evaluare | Borderou de evaluare (job #1542137) | Monitorul de evaluare | Cod sursa (job #3326348)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int di[4]={-1,0,1,0}, dj[4]={0,1,0,-1};
struct AA{
int l,c,pasi;
};
int mat[1002][1002], n , m, fr[1001][1002], lfinal,cfinal,lstart,cstart,dist[1002][1002];
int sp[1002][1002];
vector<AA> vd;
queue<AA> coada;
void Completeaza(){
int k, l ,c, pasi;
AA aux, varf;
while(!coada.empty()){
varf=coada.front();
coada.pop();
for(k=0;k<4;k++){
l = varf.l + di[k];
c = varf.c + dj[k];
pasi = varf.pasi + 1;
if(!fr[l][c] && mat[l][c]!=-1){
dist[l][c] = pasi;
fr[l][c]=1;
coada.push({l,c,pasi});
}
}
}
}
bool Posibil(int l,int c, int lg){
int ll,cc;
fr[l][c] = 1;
if(l == lfinal && c == cfinal)
return true;
int h=0;
for(int k=0;k<4;k++){
ll = l+di[k];
cc = c+dj[k];
if(mat[ll][cc]!=-1 && !fr[ll][cc] && dist[ll][cc] >= lg)
h += Posibil(ll,cc,lg);
}
return h;
}
int main(){
char c;
int i,j;
fin >> n >> m;
for(i=0;i<=n+1;i++)
mat[i][0] = mat[i][m+1] = -1;
for(i=0;i<=m+1;i++)
mat[0][i] = mat[n+1][i] = -1;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
fin >> c;
if(c=='I'){
lstart = i;
cstart = j;
continue;
}
if(c=='*'){
mat[i][j] = -1;
fr[i][j]=1;
continue;
}
if(c=='D'){
mat[i][j] = -1;
fr[i][j]=1;
coada.push({i,j,0});
continue;
}
if(c=='O'){
lfinal = i;
cfinal = j;
continue;
}
}
}
Completeaza();
// for(i=1;i<=n;i++,fout<<endl){
// for(j=1;j<=m;j++)
// fout << dist[i][j] << " ";
// }
int st, dr, mij, ans=-1;
st=1;
dr=10000;
while(st <= dr){
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
fr[i][j]=0;
mij = (st+dr)/2;
if(Posibil(lstart,cstart,mij)){
ans = mij;
st=mij+1;
}
else
dr = mij-1;
}
fout << ans;
}