Cod sursa(job #2552959)

Utilizator divianegoescuDivia Negoescu divianegoescu Data 21 februarie 2020 13:14:32
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.31 kb
/*#include <fstream>
#include <deque>
#define K 1003
#define INF 1000000000
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int f[K][K],b[K][K],i,j,n,m,st,mid,dr,is,js,ifin,jfin,iv,jv;
int di[]={0,1,0,-1};
int dj[]={1,0,-1,0};
char a[K][K];
deque <pair<int,int> > c;
int verif(int x){
    ///verif daca exista drum in care toti dragonii sa fie la minim x departare
    while(!c.empty())
        c.pop_front();
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            f[i][j]=0;
    if(b[is][js]<x)return 0;
    c.push_back({is,js});
    f[is][js]=1;
    while(!c.empty()){
        i=c.front().first;
        j=c.front().second;
        if(i==ifin && j==jfin) return 1;
        c.pop_front();
        for(int dir=0;dir<4;dir++){
            if(!(iv&&jv&&iv<=n&&jv<=m))continue;
            if(a[iv][jv]=='*')continue;
            if(!f[iv][jv] && b[iv][jv]>=x){
                c.push_back({iv,jv});
                f[iv][jv]=1;
            }
        }
    }
    return 0;
}
int main(){
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            fin>>a[i][j];
            b[i][j]=INF;
            if(a[i][j]=='D'){
                c.push_back({i,j});
                b[i][j]=0;
            }
            if(a[i][j]=='I'){
                is=i; js=j;
            }
            if(a[i][j]=='O'){
                ifin=i; jfin=j;
            }
        }
    ///calculez pt fiecare celula distantele pana la toti dragonii si retin minimul
    while(!c.empty()){
        i=c.front().first;
        j=c.front().second;
        c.pop_front();
        for(int dir=0;dir<4;dir++){
            int iv=i+di[dir];
            int jv=j+dj[dir];
            if(!(iv&&jv&&iv<=n&&jv<=m))continue;
            if(a[iv][jv]=='*')continue;
            if(b[iv][jv]==INF){
                b[iv][jv]=b[i][j]+1;
                c.push_back({iv,jv});
            }
        }
    }
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++)
            if(b[i][j]==INF)fout<<"-1 ";
        else
            fout<<" "<<b[i][j]<<" ";
        fout<<"\n";
    }
    ///caut binar rezultatul
    st=1; dr=2000;
    while(st<=dr){
        mid=(st+dr)/2;
        if(!verif(mid))
            dr=mid-1;
        else st=mid+1;
    }
    fout<<verif (0);
    return 0;
}*/