Cod sursa(job #2640656)

Utilizator RaresFelixTudose Rares Felix RaresFelix Data 7 august 2020 11:33:48
Problema Barbar Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <bits/stdc++.h>
#define SSTR( x ) static_cast< std::ostringstream & >( \
        ( std::ostringstream() << std::dec << x ) ).str()
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef vector<pair<int,int> > vii;

deque<ii> DII;
ifstream fi("barbar.in");
ofstream fo("barbar.out");
int n,m,nr_dr,A[1005][1005];
bitset<1005> V[1005];
char S[1005][1005];

void bfs()
{
    ii P[] = {{1,0},{-1,0},{0,1},{0,-1}};
    while(!DII.empty()){
        ii acum = DII.front();DII.pop_front();
        V[acum.first][acum.second]=1;int pepe = A[acum.first][acum.second];
        for(auto it:P){
            int x=acum.first+it.first,y=acum.second+it.second;
            if(!V[x][y] && (x&&y&&(x<=n)&&(y<=n))){
                V[x][y]=1;
                A[x][y]=1+pepe;
                DII.push_back({x,y});
            }
        }
    }
}
int xs,ys,xf,yf;
int dfs(int a,int b,int c)
{
    V[a][b]=1;
    ii P[] = {{1,0},{-1,0},{0,1},{0,-1}};
    for(auto it:P){
        int x=a+it.first,y=b+it.second;
        if(!V[x][y] && (x&&y&&(x<=n)&&(y<=n)) && A[x][y]>=c){
            dfs(x,y,c);
        }

    }
}
int ok(int x)
{
    for(int i=1;i<=1000;i++)
        for(int j=1;j<=1000;j++)
            V[i][j]=0;
    dfs(xs,ys,x);
    return V[xf][yf];
}

void bin()
{
    int st=1,dr=2*n+5,mij;
    if(!ok(1)){fo<<-1;return;}
    while(st<dr){
        mij=(st+dr)/2;
        if(ok(mij)){
            st=mij;
        }
        else dr=mij-1;
    }
    fo<<st;
}

int main()
{
    ///cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    fi>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            fi>>S[i][j];
            if(S[i][j]=='D'){
                A[i][j]=0;
                DII.push_back({i,j});
            }
            if(S[i][j]=='I'){
                xs=i;ys=j;
            }
            if(S[i][j]=='O'){
                xf=i;yf=j;
            }
        }
    }
    bfs();
    bin();
    return 0;
}