Cod sursa(job #2506560)

Utilizator DragosGavrusDragos Gavrus DragosGavrus Data 8 decembrie 2019 13:30:45
Problema Barbar Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.29 kb
#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;
}