Cod sursa(job #1856967)

Utilizator RazvanatorHilea Razvan Razvanator Data 25 ianuarie 2017 17:45:08
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.72 kb
#include <fstream>
#include <queue>
#include <iomanip>

using namespace std;

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

struct coord
{
    int x,y;
}a;

int m,n,mat[1002][1002],startx,starty;
int di[4]={0,0,-1,1};
int dj[4]={-1,1,0,0};
coord redo[180000000];

queue <coord> coada;
int q=0;

void Read()
{
    fin>>m>>n;
    char c;
    for (int i=0;i<=m+1;i++)
        for (int j=0;j<=n+1;j++) {
            if (i==0 || j==0 || i==m+1 || j==n+1) mat[i][j]=-5;
            else {
                fin>>c;
                if (c=='D') {
                    mat[i][j]=-3;
                    a.x=i;
                    a.y=j;
                    coada.push(a);
                }
                else if (c=='O') mat[i][j]=-1;
                    else if (c=='*') mat[i][j]=-2;
                        else if (c=='I') {
                            startx=i;
                            starty=j;
                        }
            }
        }
}

void Lee()
{
    int i,j,i_urm,j_urm,ok;
    while (!coada.empty()) {
        ok=0;
        i=coada.front().x;
        j=coada.front().y;
        if (mat[i][j]==-3) {mat[i][j]=0;ok=1;}
        for (int x=0;x<4;x++) {
            i_urm=i+di[x];
            j_urm=j+dj[x];
            if (mat[i_urm][j_urm]==0 && i_urm>0 && j_urm>0 && i_urm<m+1 && j_urm<n+1) {
                mat[i_urm][j_urm]=mat[i][j]+1;
                a.x=i_urm;
                a.y=j_urm;
                coada.push(a);
            }
        }
        if (ok) mat[i][j]=-3;
        coada.pop();
    }
}

int Lee(int k)
{
    int i,j,i_urm,j_urm;
    i=startx;
    j=starty;
    for (int x=0;x<4;x++) {
        i_urm=i+di[x];
        j_urm=j+dj[x];
        if (mat[i_urm][j_urm]>=k && i_urm>0 && j_urm>0 && i_urm<m+1 && j_urm<n+1) {
            redo[q++]=a;
            mat[i_urm][j_urm]=-mat[i_urm][j_urm];
            a.x=i_urm;
            a.y=j_urm;
            coada.push(a);
        }
    }
    while (!coada.empty()) {
        i=coada.front().x;
        j=coada.front().y;
        for (int x=0;x<4;x++) {
            i_urm=i+di[x];
            j_urm=j+dj[x];
            if (mat[i_urm][j_urm]>=k && i_urm>0 && j_urm>0 && i_urm<m+1 && j_urm<n+1) {
                mat[i_urm][j_urm]=-mat[i_urm][j_urm];
                redo[q++]=a;
                a.x=i_urm;
                a.y=j_urm;
                coada.push(a);
            }
            if (mat[i_urm][j_urm]==-1) return 1;
        }
        coada.pop();
    }
    return 0;
}

void refa()
{
    for (int i=0;i<q;i++) mat[redo[i].x][redo[i].y]=-mat[redo[i].x][redo[i].y];
}


int cautare_binara()
{
    int pas=1<<30,i=0;
    while (pas!=0) {
        q=0;
        if (Lee(pas)) i+=pas;
        pas/=2;
    }
    return i;
}

int main()
{
    Read();
    Lee();
    fout<<cautare_binara()-1;
}