Cod sursa(job #2294214)

Utilizator miruna1224Floroiu Miruna miruna1224 Data 2 decembrie 2018 01:30:46
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.76 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <queue>

using namespace std;

struct Punct
{
    int x, y;
} S, C;

const int N = 2010;
bool **valid, **viz;
int **dist;
//bool valid[N][N], viz[N][N];
//int dist[N][N];
int m , n, dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
queue <Punct> q;

void Setare_viz()
{
    int i, j;
    for ( i = 0; i <= n ; i++)
        for ( j = 0 ; j <= m ; j ++)
            viz[i][j] = 0;
}

void verif ()
{
    int i;
    Punct aux,aux2;

    while ( !q.empty() )
    {
        aux = q.front();
        q.pop();

        for (i = 0; i < 4; i++)
        {
            aux2.x = aux.x + dx[i];
            aux2.y = aux.y + dy[i];
            if(aux2.x && aux2.y && aux2.x <= n && aux2.y <= m)
                if(viz[aux2.x][aux2.y] == false)
                    //if ( !viz[aux2.x][aux2.y] && aux2.x && aux2.y && aux2.x <= n && aux2.y <= m)
                {
                    viz[aux2.x][aux2.y] = true;
                    dist[aux2.x][aux2.y] = dist[aux.x][aux.y]+1;
                    q.push(aux2);
                }
        }
    }
}

bool Lee ( int p )
{
    if(dist[S.x][S.y] < p)
        return false;

    Setare_viz();

    viz[S.x][S.y] = 1;
    q.push(S);

    Punct aux, aux2;
    int i;

    while(!q.empty())
    {
        aux = q.front();
        q.pop();
        for ( i = 0; i < 4 ; i++)
        {
            aux2.x = aux.x + dx[i];
            aux2.y = aux.y + dy[i];


            if(aux2.x && aux2.y && aux2.x <= n && aux2.y <= m)
                if(dist[aux2.x][aux2.y] >= p && viz[aux2.x][aux2.y] == false && valid[aux2.x][aux2.y] == false)
                    //if ( aux2.x && aux2.y && aux2.x <= n && aux2.y <= m && dist[aux2.x][aux2.y] >= p && !viz[aux2.x][aux2.y]  && !valid[aux2.x][aux2.y])
                {
                    viz[aux2.x][aux2.y] = 1;
                    q.push(aux2);

                    if( aux2.x == C.x && aux2.y == C.y )
                    {
                        while( !q.empty())
                            q.pop();
                        return true;
                    }
                }
        }
    }
    return false;
}

int cautare()
{
    int st = 0, dr = N, m, sol = -1;
    while(st <= dr)
    {
        m =(st + dr) / 2;

        if( Lee( m ) )
        {
            sol = m;
            st = m + 1;
        }
        else
            dr = m - 1;
    }
    return sol;
}

int main()
{
    ifstream in ("barbar.in");
    ofstream out ("barbar.out");


    char h[N];
    int i ,j;
    in >> n >> m;
    dist = new int*[n+3];
    viz = new bool*[n+3];
    valid = new bool*[n+3];
    for (i = 0 ; i <= n+1; i++)
    {
        dist[i] = new int[m+3];
        valid[i]= new bool[m+3];
        viz[i] = new bool[m+3];
    }
    for (i = 1 ; i <= n; i++)
    {
        in >> h;
        for ( j = 1; j <= m ; j++)
        {
            if( h[j] == '*')
                valid[i][j+1] = 1;
            else
            {
                if(h[j] == 'I')
                {
                    S.x = i;
                    S.y = j+1;
                }
                else
                {
                    if ( h[j] == 'O')
                    {
                        C.x = i;
                        C.y = j+1;
                    }
                    else if(h[j] == 'D')
                    {
                        viz[i][j+1] = 1;
                        Punct xx;
                        xx.x = i;
                        xx.y = j+1;
                        q.push(xx);
                    }
                }
            }
        }
    }

    verif();

    int sol = cautare();
    out << sol;

    in.close();
    out.close();

    return 0;
}