Cod sursa(job #1702196)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 14 mai 2016 18:25:45
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
///I give up
#include <bits/stdc++.h>
using namespace std;

const int LMAX = 1005;
const int   SM = 1<<12;

struct APOZ {
    int x, y;
};

struct BPOZ {
    int x, y, val;
};

int r, c, d, sx, sy;
char mx[LMAX][LMAX];
int dst[LMAX][LMAX],
    aux[LMAX][LMAX];

int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};

void init(void) {
    int x, y, nx, ny, val;
    queue<BPOZ> q;

    for(int i=0; i<=r+1; ++i) {
        mx[i][0]='*';
        mx[i][c+1]='*';
    }
    for(int j=0; j<=c+1; ++j) {
        mx[0][j]='*';
        mx[r+1][j]='*';
    }

    for(int i=1; i<=r; ++i) {
        for(int j=1; j<=c; ++j) {
            if(mx[i][j]=='D') {
                q.push({i, j, 1});
                dst[i][j] = 1;
            }
            if(mx[i][j]=='I') {
                sx = i;
                sy = j;
            }
        }
    }

    while(!q.empty()) {
        x   = q.front().x;
        y   = q.front().y;
        val = q.front().val;
        q.pop();

        for(int i=0; i<4; ++i) {
            nx = x + dx[i];
            ny = y + dy[i];

            if(dst[nx][ny] || mx[nx][ny]=='*')
                continue;

            dst[nx][ny] = val+1;
            q.push({nx, ny, val+1});
        }
    }
}

bool check(int x, int y) {
    if(mx[x][y]=='O') return true;

    bool ans = false;
    aux[x][y]=d;

    for(int i=0; i<4; ++i)
        if(aux[x+dx[i]][y+dy[i]]!=d && dst[x+dx[i]][y+dy[i]]>d && mx[x+dx[i]][y+dy[i]]!='*')
            ans = ans || check(x+dx[i], y+dy[i]);

    return ans;
}

int main(void) {
    FILE *fi = fopen("barbar.in", "r");
    FILE *fo = fopen("barbar.out", "w");
    int ans;

    ans = 0;

    fscanf(fi,"%d%d ",&r,&c);
    for(int i=1; i<=r; ++i)
        fgets(mx[i]+1, 1001, fi);

    init();

    for(int m=SM; m; m>>=1) {
        d=ans|m;
        if(check(sx, sy))
            ans|=m;
    }

    d=-1;
    if(!check(sx, sy))
        fprintf(fo,"-1\n");
    else
        fprintf(fo,"%d\n",ans);

    fclose(fi);
    fclose(fo);
    return 0;
}