Cod sursa(job #1712244)

Utilizator liviu23Liviu Andrei liviu23 Data 2 iunie 2016 14:47:55
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <fstream>
#include <queue>
#define DIM 1005
using namespace std;

struct punct {
    int i;
    int j;
};

int n,m,harta[DIM][DIM],maxim;
punct start, finish;
queue<punct> coada;

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

bool traverse(int op) {
    if(op>=0&&harta[start.i][start.j]<op)
        return false;
    if(op>=0)
        coada.push(start);
    punct poz,pozUrm,dir[]={{-1,0},{1,0},{0,-1},{0,1}};
    bool viz[DIM][DIM];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            viz[i][j]=false;
    viz[start.i][start.j]=true;
    while(!coada.empty()) {
        poz=coada.front();
        for(int i=0;i<4;i++) {
            pozUrm={poz.i+dir[i].i,poz.j+dir[i].j};
            if(isOk(pozUrm)) {
                if(op==-1&&harta[pozUrm.i][pozUrm.j]==0) {
                    harta[pozUrm.i][pozUrm.j]=harta[poz.i][poz.j]+1;
                    if(harta[pozUrm.i][pozUrm.j]>maxim)
                        maxim=harta[pozUrm.i][pozUrm.j];
                    coada.push(pozUrm);
                }
                else if(op>=0&&harta[pozUrm.i][pozUrm.j]>=op&&!viz[pozUrm.i][pozUrm.j]) {
                    viz[pozUrm.i][pozUrm.j]=true;
                    coada.push(pozUrm);
                }
            }
        }
        coada.pop();
    }
    if(viz[finish.i][finish.j])
        return true;
    return false;
}

int getDist() {
    int dist=0,st=1,dr=maxim,mij;
    while(st<=dr) {
        mij=(st+dr)/2;
        if(traverse(mij))
            dist=mij,st=mij+1;
        else
            dr=mij-1;
    }
    return dist-1;
}

int main()
{
    ifstream fin("barbar.in");
    ofstream fout("barbar.out");
    fin>>n>>m;
    char car;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++) {
        fin>>car;
        if(car=='*')
            harta[i][j]=-1;
        else if(car=='I')
            start={i,j};
        else if(car=='D') {
            coada.push({i,j});
            harta[i][j]=1;
        }
        else if(car=='O')
            finish={i,j};
    }
    traverse(-1);
    fout<<getDist();
    return 0;
}