Cod sursa(job #1211965)

Utilizator MaarcellKurt Godel Maarcell Data 23 iulie 2014 16:28:59
Problema Barbar Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <fstream>
#include <iostream>
using namespace std;
struct dragon{
    int x,y;
};
int R,C,si,sj,ei,ej,l,r, a[1010][1010],aux[1010][1010]; char c; dragon d[1000*1000+10];
bool exista=false;
void propagate(int x, int y, int k){
    if (k==0) return;
    if (x>0 && x<=R && y>0 && y <=C && !aux[x][y]){
        aux[x][y]=1;
        propagate(x+1,y,k-1);
        propagate(x-1,y,k-1);
        propagate(x,y-1,k-1);
        propagate(x,y+1,k-1);
    }
}
void drum(int x, int y){
    if (x==ei && y==ej) { exista=true; return; }
    if (x>0 && x<=R && y>0 && y<=C && !aux[x][y]){
        aux[x][y]=1;
        drum(x+1,y);
        drum(x-1,y);
        drum(x,y+1);
        drum(x,y-1);
    }
}
int main(){
    ifstream in("barbar.in");
    ofstream out("barbar.out");
    in>> R >> C;
    int i,j,L=0;
    for (i=1; i<=R; i++)
        for (j=1; j<=C; j++){
            in >> c;
            if (c=='.') a[i][j]=0;
            else if (c=='*') a[i][j]=1;
            else if (c=='D') { L++; d[L].x=i; d[L].y=j; }
            else if (c=='I') { si=i; sj=j;}
            else { ei=i; ej=j; }
    }
    l=0;
    r=10000;
    int mid;
    while ((r-l)>1) {
        mid = (l+r)/2;
        for (i=1; i<=R; i++)
            for (j=1; j<=C; j++) aux[i][j]=a[i][j];
        for (i=1; i<=L; i++) propagate(d[i].x, d[i].y, mid);

        exista=false;
        drum(si,sj);
        if (exista) l=mid;
        else r=mid-1;

    }
    for (i=1; i<=R; i++)
        for (j=1; j<=C; j++) aux[i][j]=a[i][j];
    for (i=1; i<=L; i++) propagate(d[i].x, d[i].y, r);

    exista=false;
    drum(si,sj);
    if (exista) l =r;

    for (i=1; i<=R; i++)
        for (j=1; j<=C; j++) aux[i][j]=a[i][j];

    exista=false;
    drum(si,sj);
    if (!exista) l=-1;

    out << l;
    return 0;
}