Cod sursa(job #1696465)

Utilizator anav23Ana Vasiliu anav23 Data 29 aprilie 2016 10:25:42
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;

struct punct {
    int i;
    int j;
} start,finish,dir[]={{-1,0},{1,0},{0,-1},{0,1}};

int r,c,m[1005][1005];
bool viz[1005][1005];
queue<punct> coada;

bool isOk(punct poz) {
    return (poz.i>=1&&poz.i<=r&&poz.j>=1&&poz.j<=c&&m[poz.i][poz.j]!=-1);
}

void lee(int minim) {
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++)
            viz[i][j]=false;
    if(minim>m[start.i][start.j])
        return;
    punct poz,pozUrm;
    while(!coada.empty())
        coada.pop();
    coada.push(start);
    viz[start.i][start.j]=true;
    while(!coada.empty()) {
        poz=coada.front();
        for(int k=0;k<4;k++) {
            pozUrm={poz.i+dir[k].i,poz.j+dir[k].j};
            if(isOk(pozUrm)&&m[pozUrm.i][pozUrm.j]>=minim&&!viz[pozUrm.i][pozUrm.j]) {
                viz[pozUrm.i][pozUrm.j]=true;
                coada.push(pozUrm);
            }
        }
        coada.pop();
    }
}

int formMatrice() {
    int maxim=0;
    punct poz,pozUrm;
    while(!coada.empty()) {
        poz=coada.front();
        for(int k=0;k<4;k++) {
            pozUrm={poz.i+dir[k].i,poz.j+dir[k].j};
            if(isOk(pozUrm)&&m[pozUrm.i][pozUrm.j]==0) {
                m[pozUrm.i][pozUrm.j]=m[poz.i][poz.j]+1;
                if(m[pozUrm.i][pozUrm.j]>maxim)
                    maxim=m[pozUrm.i][pozUrm.j];
                coada.push(pozUrm);
            }
        }
        coada.pop();
    }
    return maxim;
}

int main()
{
    ifstream fin("barbar.in");
    ofstream fout("barbar.out");
    fin>>r>>c;
    char caracter;
    for(int i=1;i<=r;i++)
    for(int j=1;j<=c;j++) {
        fin>>caracter;
        if(caracter=='*')
            m[i][j]=-1;
        else if(caracter=='I')
            start={i,j};
        else if(caracter=='D') {
            m[i][j]=1;
            coada.push({i,j});
        }
        else if(caracter=='O')
            finish={i,j};
    }
    int st=1,dr=formMatrice(),mij,best=0;
    while(st<=dr) {
        mij=(st+dr)/2;
        lee(mij);
        if(!viz[finish.i][finish.j])
            dr=mij-1;
        else {
            st=mij+1;
            best=mij;
        }
    }
    fout<<best-1<<'\n';
    return 0;
}