Cod sursa(job #1606478)

Utilizator dsergiu05Sergiu Druga dsergiu05 Data 20 februarie 2016 12:12:01
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <fstream>

using namespace std;

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

const int nd=4;
const int dx[4]={1,-1,0,0}, dy[4]={0,0,1,-1};
const int nmax=1000;

int v[nmax+2][nmax+2];
int qx[nmax*nmax+1], qy[nmax*nmax+1];
int qb=1,qe=0;
int v2[nmax+2][nmax+2];

int n,m;
int x1, y1, x2, y2;
int f(int d) {
    qb=1;
    qe=0;
    qe++;
    qx[qe]=x1;
    qy[qe]=y1;
    for (int i=1; i<=n; i++) {
        for (int j=1; j<=m; j++) {
            v2[i][j]=0;
        }
    }
    v2[x1][y1]=1;

    while (qb<=qe) {
        int x=qx[qb], y=qy[qb];
        qb++;
        for (int i=0; i<nd; i++) {
            int xn=x+dx[i], yn=y+dy[i];
            if (v[xn][yn]!=-1 && v2[xn][yn]==0 && v[xn][yn]>=d) {
                v2[xn][yn]=1;
                qe++;
                qx[qe]=xn;
                qy[qe]=yn;
            }
        }
    }
    return v2[x2][y2];
}

int main () {
    string s;
    fin>>n>>m;
    for (int i=1; i<=n; i++){
        fin>>s;
        for (int j=0; j<m; j++){
            if (s[j]=='D') {
                v[i][j+1]=0;
                qe++;
                qx[qe]=i;
                qy[qe]=j+1;
            } else if (s[j]=='.') {
                v[i][j+1]=0;
            } else if (s[j]=='*') {
                v[i][j+1]=-1;
            } else if (s[j]=='I') {
                v[i][j+1]=0;
                x1=i;
                y1=j+1;
            } else if (s[j]=='O') {
                v[i][j+1]=0;
                x2=i;
                y2=j+1;
            }
        }
    }

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

    while (qb<=qe) {
        int x=qx[qb],y=qy[qb];
        qb++;
        for (int i=0; i<nd; i++) {
            int xn=x+dx[i], yn=y+dy[i];
            if (v[xn][yn]==0) {
                v[xn][yn]=v[x][y]+1;
                qe++;
                qx[qe]=xn;
                qy[qe]=yn;
            }
        }
    }

    int n2;
    for (n2=1; n2<=n*n; n2*=2 ) {
    }
    n2/=2;

    int sol=0;
    for (int step=n2; step>0; step/=2) {
        if (sol+step<=m*n && f(sol+step)==1) {
            sol+=step;
        }
    }
    fout<<sol<<"\n";
    return 0;
}