Cod sursa(job #1856906)

Utilizator RazvanatorHilea Razvan Razvanator Data 25 ianuarie 2017 16:59:34
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 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};

queue <coord> coada;

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 fill(int i,int j,int k,int i_ant,int j_ant)
{
    if (mat[i][j]==-1) return 1;
    if (mat[i][j]==-3) return 0;
    if (j-1>0 && i-1>0 && j+1<n+1 && i+1<m+1 && i_ant!=i && j_ant!=j) {
        if (mat[i+1][j]<=k) fill(i+1,j,k,i,j);
        if (mat[i-1][j]<=k) fill(i-1,j,k,i,j);
        if (mat[i][j+1]<=k) fill(i,j+1,k,i,j);
        if (mat[i][j-1]<=k) fill(i,j-1,k,i,j);
    }
}

int cautare_binara()
{
    int pas=1<<11,i=1<<12;
    while (pas!=0) {
        if (fill(startx,starty,i-pas,startx,starty)) i-=pas;
        pas/=2;
    }
    return i;
}

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