Cod sursa(job #1334321)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 4 februarie 2015 11:09:44
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.95 kb
#include <fstream>
#include <cstring>
#define DIM 1001
using namespace std;

ifstream fin ("barbar.in" );
ofstream fout("barbar.out");

int istart, jstart, ifinish, jfinish;
int N, M, i, j, k, ok, jj, ii,  p, u;
int A[DIM][DIM],  B[DIM][DIM],  a, b;
int C[3][DIM*DIM], ic, jc, iv, jv, d;
int diri[5] = {0,-1, 0, 1, 0};
int dirj[5] = {0, 0, 1, 0,-1};

int mid;
char x;

void SetUp(){
    fin >> N >> M;
    for(i = 1; i <= N; i ++)
        for(j = 1; j <= M; j ++){
            fin >> x;
            if(x == 'I'){
                istart  = i;
                jstart  = j;
                A[i][j] =-2;
            }
            if(x == 'O'){
                ifinish = i;
                jfinish = j;
                A[i][j] =-2;
            }
            if(x == 'D'){
                u ++;
                C[1][u] = i;
                C[2][u] = j;
                A[i][j] = 0;
            }
            if(x == '*')
                A[i][j] =-1;
            if(x == '.')
                A[i][j] =-2;
        }
    return;
}

void BFS_1(){
    p = 1;
    while(p <= u){
        ic = C[1][p];
        jc = C[2][p];
        for(d = 1; d <= 4; d ++){
            iv = ic + diri[d];
            jv = jc + dirj[d];
            if(iv >= 1 && iv <= N)
                if(jv >= 1 && jv <= M)
                    if(A[iv][jv] == -2){
                        u ++;
                        C[1][u] = iv;
                        C[2][u] = jv;
                        A[iv][jv] = A[ic][jc] + 1;
                    }
        }
        p ++;
    }
    return;
}

void BFS_2(){
    a = 0; b = A[istart][jstart];
    if(b > A[ifinish][jfinish])
        b = A[ifinish][jfinish];
    memset(C[1], 0, sizeof(C[1]));
    memset(C[2], 0, sizeof(C[2]));
    while(a <= b){
        p = 1;  u = 1;
        mid = (a+b)/2;
        C[1][u] = istart;
        C[2][u] = jstart;
        B[istart][jstart] = 1;
        while(p <= u){
            ic = C[1][p];
            jc = C[2][p];
            for(d = 1; d <= 4; d ++){
                iv = ic + diri[d];
                jv = jc + dirj[d];
                if(iv >= 1 && iv <= N)
                    if(jv >= 1 && jv <= M)
                        if(A[iv][jv] >= mid)
                            if(B[iv][jv] == 0){
                                u ++;
                                C[1][u] = iv;
                                C[2][u] = jv;
                                B[iv][jv] =1;
                            }
            }
            if(B[ifinish][jfinish] == 1)
                break;
            p ++;
        }
        if(p <= u)
            a = mid + 1;
        else
            b = mid - 1;
        for(i = 1; i <= N; i ++)
            for(j = 1; j <= M; j ++)
                B[i][j] = 0;
    }
    if(A[ifinish][jfinish] == -2)
        fout << -1;
    else
        fout << b;
    return;
}

int main(){
    SetUp();
    BFS_1();
    BFS_2();
    return 0;
}