Cod sursa(job #2083045)

Utilizator anca.sotirAnca Sotir anca.sotir Data 6 decembrie 2017 23:54:17
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.22 kb
#include <fstream>
#include<bits/stdc++.h>
#define nmax 1002
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");

struct punct
{
    int i,j,val;
} P[nmax],start,iesire;

int L,C,n,A[nmax][nmax],vizitati[nmax][nmax];

queue <punct> v;

void Lee(int minim)
{
    while(v.size()>0)
    {
        int i=v.front().i;
        int j=v.front().j;
        if(vizitati[i+1][j]==0 && A[i+1][j]>=minim)
        {
            punct vecin;
            vecin.i=i+1;
            vecin.j=j;
            v.push(vecin);
            vizitati[i+1][j]=1;
        }
        if(vizitati[i-1][j]==0 && A[i-1][j]>=minim)
        {
            punct vecin;
            vecin.i=i-1;
            vecin.j=j;
            v.push(vecin);
            vizitati[i-1][j]=1;
        }
        if(vizitati[i][j+1]==0 && A[i][j+1]>=minim)
        {
            punct vecin;
            vecin.i=i;
            vecin.j=j+1;
            v.push(vecin);
            vizitati[i][j+1]=1;
        }
        if(vizitati[i][j-1]==0 && A[i][j-1]>=minim)
        {
            punct vecin;
            vecin.i=i;
            vecin.j=j-1;
            v.push(vecin);
            vizitati[i][j-1]=1;
        }
        v.pop();
    }

}
int cautare(int i,int j)
{
    if(i>j) return -1;
    if(i==j)
    {
        v.push(start);
        for(int i=1; i<=L; ++i)
            for(int j=1; j<=C; ++j)
                vizitati[i][j]=0;
        vizitati[start.i][start.j]=1;
        Lee(i);
        if(vizitati[iesire.i][iesire.j]==1)
            return i;
        else return -1;
    }
    if(j==i+1)
    {
        v.push(start);
        for(int i=1; i<=L; ++i)
            for(int j=1; j<=C; ++j)
                vizitati[i][j]=0;
        vizitati[start.i][start.j]=1;
        Lee(j);
        if(vizitati[iesire.i][iesire.j]==1)
            return j;
        if(i!=1)
            return i;
        return cautare(1,1);
    }
    if(i<j)
    {
        int mij=(i+j)/2;
        v.push(start);
        for(int i=1; i<=L; ++i)
            for(int j=1; j<=C; ++j)
                vizitati[i][j]=0;
        vizitati[start.i][start.j]=1;
        Lee(mij);
        if(vizitati[iesire.i][iesire.j])
            return cautare(mij,j);
        else return cautare(i,mij-1);
    }
}

int main()
{
    ///codificari:
    /// celula libera   .   -1
    /// perete          *   -2
    /// dragon          D    0
    /// start           I
    /// iesire          O

    f>>L>>C;
    for(int i=1; i<=L; ++i)
        for(int j=1; j<=C; ++j)
        {
            char c;
            f>>c;
            switch (c)
            {
            case '.':
                A[i][j]=-1;
                break;
            case '*':
                A[i][j]=-2;
                break;
            case 'D':
                A[i][j]=0;
                punct dragon;
                dragon.i=i;
                dragon.j=j;
                dragon.val=0;
                v.push(dragon);
                break;
            case 'I':
                start.i=i;
                start.j=j;
                A[i][j]=-1;
                break;
            case 'O':
                iesire.i=i;
                iesire.j=j;
                A[i][j]=-1;
                break;
            }
        }
    while(v.size()>0)
    {
        int i=v.front().i;
        int j=v.front().j;
        if(A[i+1][j]==-1)
        {
            punct vecin;
            vecin.i=i+1;
            vecin.j=j;
            A[i+1][j]=vecin.val=A[i][j]+1;
            v.push(vecin);
        }
        if(A[i-1][j]==-1)
        {
            punct vecin;
            vecin.i=i-1;
            vecin.j=j;
            A[i-1][j]=vecin.val=A[i][j]+1;
            v.push(vecin);
        }
        if(A[i][j+1]==-1)
        {
            punct vecin;
            vecin.i=i;
            vecin.j=j+1;
            A[i][j+1]=vecin.val=A[i][j]+1;
            v.push(vecin);
        }
        if(A[i][j-1]==-1)
        {
            punct vecin;
            vecin.i=i;
            vecin.j=j-1;
            A[i][j-1]=vecin.val=A[i][j]+1;
            v.push(vecin);
        }
        v.pop();
    }

    g<<cautare(1,A[start.i][start.j]);
    return 0;
}