Cod sursa(job #2641099)

Utilizator RaresFelixTudose Rares Felix RaresFelix Data 10 august 2020 06:37:41
Problema Barbar Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 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;

ifstream fi("barbar.in");
ofstream fo("barbar.out");

char S[1005][1005];
int C[1005][1005];
int VIZ[1005][1005];
int n,m,xs,xf,ys,yf;
deque<ii> DII;
ii P[]={{-1,0},{1,0},{0,1},{0,-1}};

int dfs(int x,int y,int w)
{
    int op = VIZ[x][y];

    if(VIZ[x][y]==1)return 0;
    VIZ[x][y]=1;
    int x1,y1;
    for(auto it : P){
        x1=x+it.first;y1=y+it.second;
        if(!VIZ[x1][y1] && C[x1][y1]>=w && (x1&&y1&&(x1<=n)&&(y1<=m)) && S[x1][y1]!='*')dfs(x1,y1,w);
    }
}
int ok(int w)
{
    for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) VIZ[i][j]=0;
    dfs(xs,ys,w);
    int xd =VIZ[xf][yf];
    return (VIZ[xf][yf]==1);
}
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')DII.push_back({i,j});
            if(S[i][j]=='I'){xs=i;ys=j;}
            if(S[i][j]=='O'){xf=i;yf=j;}
        }
    ii element ;int x1,x2,y1,y2;
    while(!DII.empty()){
        element=DII.front();x1=element.first;y1=element.second;DII.pop_front();

        VIZ[x1][y1]=1;
        for(auto it : P){
            x2=x1+it.first;y2=y1+it.second;
            if(!VIZ[x2][y2] && (x2&&y2&&(x2<=n)&&(y2<=m)) && S[x2][y2]!='*'){
                DII.push_back({x2,y2});
                VIZ[x2][y2]=1;C[x2][y2]=1+C[x1][y1];
            }
        }
    }
    /*
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)fo<<C[i][j]<<"";
        fo<<"\n";
    }*/
    int st=1,dr=n+m-1,mij,rez=0;
    while(st<dr){
        mij=(st+dr)/2;
        if(ok(mij)){
            if(mij>rez)rez=mij;
            st=mij+1;
        }
        else dr = mij-1;
    }
    if(rez)fo<<rez;
    else fo<<"-1\n";
    return 0;
}