Cod sursa(job #1234133)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 26 septembrie 2014 19:29:46
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.91 kb
#include<fstream>
#include<iostream>
#include<queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
const int DMAX = 1005;

int d1[] = {0,1,-1,0};
int d2[] = {1,0,0,-1};
int v[DMAX][DMAX],viz[DMAX][DMAX],sol[DMAX][DMAX],n,m;

struct punct{
    int x,y;
};
struct punct start,finish;
queue<struct punct> coada;

void citire()
{

    struct punct now;
    char c;
    in>>n>>m;
    for(int i = 1 ; i <= n ; i++)
        for(int j = 1 ; j <= m ; j++)
    {

        in>>c;
        switch(c){
            case '.':v[i][j] = 0;
            break;
            case '*':v[i][j] = 1;
            break;
            case 'D':{
                v[i][j] = 1;
                now.x = i;
                now.y = j;
                coada.push(now);
            }
            break;
            case 'I':{
                v[i][j] = 0;
                start.x = i;
                start.y = j;
            }
            break;
            case 'O':{
                v[i][j] = 0;
                finish.x = i;
                finish.y = j;
            }
            break;
        }
    }

    for(int i = 0 ; i <= n+1 ; i++)
        v[i][0] = v[i][m+1] = 1;
    for(int j = 0 ; j <= m+1 ; j++)
        v[0][j] = v[n+1][j] = 1;

    in.close();
}

void parcurge()
{

    struct punct now,k;
    int i;

    while(!coada.empty()){
        k = coada.front();
        viz[k.x][k.y] = 1;
        for(i = 0 ; i < 4 ; i++){
            now.x = k.x+d1[i];
            now.y = k.y+d2[i];
            if(!viz[now.x][now.y] && v[now.x][now.y] == 0){
                sol[now.x][now.y] = sol[k.x][k.y] + 1;
                coada.push(now);
            }
        }
        coada.pop();
    }
}

bool ok(int val)
{

    for(int i = 1 ; i <= n ; i++)
        for(int j = 1 ; j <= m ; j++)
            viz[i][j] = 0;
    struct punct now,k;
    coada.push(start);
    if(v[start.x][start.y] < val)
        return false;
    int i;

    while(!coada.empty())
    {

        k = coada.front();
        viz[k.x][k.y] = 1;
        for(i = 0 ; i < 4 ; i++)
        {

            now.x = k.x+d1[i];
            now.y = k.y+d2[i];
            if(!viz[now.x][now.y] && sol[now.x][now.y] >= val){

                    if(finish.x == now.x && finish.y == now.y){
                        while(!coada.empty())
                            coada.pop();
                        return true;
                    }

                    coada.push(now);
                }
        }
    }
    return false;
}

int bin_search(int i,int j)
{

    int mid;
    while(i <= j){
        mid = (i+j)/2;
        if(ok(mid))
            i = mid+1;
        else
            j = mid - 1;
    }
    if(j == 0 || j == (m+n-1))
        j = -1;
    return j;
}

int main()
{

    citire();
    parcurge();
    out<<bin_search(1,n+m-1);
    out.close();
    return 0;
}