Cod sursa(job #1446468)

Utilizator BlueStrutAndrei Prahoveanu BlueStrut Data 1 iunie 2015 21:40:21
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include<cstdio>
#include<algorithm>
#include<deque>
#define INF 999999999
using namespace std;
const int dx[4]={1, 0, -1, 0};
const int dy[4]={0, 1, 0, -1};
deque<pair<int,int> > cd;
int i, j, n, m, a[1005][1005], l[1005][1005], k, sol, crt, mx, cx1, cx2, cy1, cy2, x, y, st, dr, mij;
char s[1002];
inline int min(int a, int b){if (a<=b) return a; else return b;}
void initz(){
    for (i=1;i<=n;i++) {a[i][0]=-1; a[i][m+1]=-1;}
    for (i=1;i<=m;i++) {a[0][i]=-1; a[n+1][i]=-1;}
    for (i=1;i<=n;i++) {
        gets(s);
        for (j=1;j<=m;j++) {
            l[i][j]=0;
            if (s[j-1]=='.') a[i][j]=INF;
            if (s[j-1]=='*') a[i][j]=0;
            if (s[j-1]=='I') {cx1=i; cy1=j; a[i][j]=INF;}
            if (s[j-1]=='O') {cx2=i; cy2=j; a[i][j]=INF;}
            if (s[j-1]=='D') {a[i][j]=0; cd.push_back(make_pair(i,j));}
        }
        scanf("\n");
    }
}
void fill(){
    while (!cd.empty()) {
        x=(cd.front()).first; y=(cd.front()).second; cd.pop_front();
        for (k=0;k<=3;k++) if (a[x+dx[k]][y+dy[k]]>a[x][y]+1) {
            a[x+dx[k]][y+dy[k]]=a[x][y]+1;
            if (a[x+dx[k]][y+dy[k]]>mx) mx=a[x+dx[k]][y+dy[k]];
            cd.push_back(make_pair(x+dx[k], y+dy[k]));
        }
    }
}
bool det(int tsh){
    cd.clear(); cd.push_back(make_pair(cx1, cy1));
    while (!cd.empty()) {
        x=(cd.front()).first; y=(cd.front()).second; cd.pop_front();
        for (k=0;k<=3;k++)
            if ((a[x+dx[k]][y+dy[k]]>=tsh)&&(l[x+dx[k]][y+dy[k]]<crt)) {
                if ((x+dx[k]==cx2)&&(y+dy[k]==cy2)) return true;
                l[x+dx[k]][y+dy[k]]=crt;
                cd.push_back(make_pair(x+dx[k], y+dy[k]));
            }
    }
    return false;
}
int main(){
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d\n", &n, &m);
    initz();
    mx=1; fill(); st=1; dr=a[cx1][cy1]; sol=-1; crt=1;
    for (mij=st+(dr-st)/2;st<dr;mij=st+(dr-st)/2) {
        l[cx1][cy2]=crt;
        if (det(mij)==true) {sol=mij; st=mij+1;}
            else dr=mij-1;
        crt++;
    }
    if (det(st)==true) sol=st;
    printf("%d\n", sol); return 0;
}