Pagini recente » Cod sursa (job #625268) | Cod sursa (job #1895202) | Cod sursa (job #41351) | Cod sursa (job #395886) | Cod sursa (job #2506560)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("barbar.in");
ofstream g ("barbar.out");
queue <pair < int , int > > q;
pair < int ,int >st;
pair < int ,int > fn;
int viz[1005][1005] , sol[1005][1005] , vizb[1005][1005];
int n , m , ii ,jj;
int dx[]={0,0,1,-1},dy[]={-1,1,0,0};
char x;
int inside(int ii, int jj)
{
if(ii<=n && ii > 0 && jj > 0 && jj <=m)
return 1;
return 0;
}
int barbar(int lmin)
{
for(int i=1 ; i<=n ; i++)
for(int j=1;j<=m; j++)
vizb[i][j]=0;
if(sol[st.first][st.second] < lmin)
return 0;
q.push(st);
while(!q.empty()){
if(ii == fn.first && jj==fn.second)
return 1;
ii=q.front().first;
jj=q.front().second;
q.pop();
for(int i=0 ; i<4 ; i++){
if(inside(ii+dx[i], jj+dy[i]) && !vizb[ii+dx[i]][jj+dy[i]] && sol[ii+dx[i]][jj+dy[i]] >= lmin ){
q.push({ii+dx[i],jj+dy[i]});
vizb[ii+dx[i]][jj+dy[i]]=1;
}
}
}
return 0;
}
int main()
{
//1
f>>n>>m;
for(int i=1 ; i<=n ; i++){
for(int j=1 ; j<=m ;j++){
f>>x;
if(x == '.')
sol[i][j] = 0;
if(x == 'D'){
sol[i][j] = 0;
viz[i][j] = 1;
q.push({i,j});
}
if(x == 'I'){
sol[i][j] = 0;
st={i,j};
}
if(x == 'O'){
sol[i][j] = 0;
fn={i,j};
}
if(x == '*'){
sol[i][j] = -1;
viz[i][j] = -1;
}
}
}
//2
while(!q.empty()){
ii=q.front().first;
jj=q.front().second;
q.pop();
for(int i=0 ; i<4 ; i++){
if(inside(ii+dx[i], jj+dy[i]) && !viz[ii+dx[i]][jj+dy[i]]){
q.push({ii+dx[i],jj+dy[i]});
viz[ii+dx[i]][jj+dy[i]]=1;
sol[ii+dx[i]][jj+dy[i]]=sol[ii][jj]+1;
}
}
}
int solmin=0;
for(int i=(1<<12) ; i>0 ;i>>=1){
if(barbar(solmin+i)==1)
solmin+=i;
}
if(barbar(solmin)==1)
g<<solmin;
else
g<<-1;
return 0;
}