Cod sursa(job #1399368)

Utilizator BlueStrutAndrei Prahoveanu BlueStrut Data 24 martie 2015 18:32:54
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include<cstdio>
#include<algorithm>
#include<deque>
using namespace std;
deque<pair<int,int> > cd, cd2;
const int dx[4]={0, 1, 0, -1};
const int dy[4]={1, 0, -1, 0};
pair<int,int> p;
int i, j, n, m, x, y, a[1002][1002], b[1002][1002], ics1, ics2, igrec1, igrec2, st, dr, mij, k, sol;
char s[1002];
bool test(int dist){
    int k; ///
    for (i=1;i<=n;i++) for (j=1;j<=m;j++)
        if (a[i][j]>=dist) b[i][j]=999999999; else b[i][j]=-1;
    cd.clear(); cd.push_back(make_pair(ics1,igrec1)); b[ics1][igrec1]=0;
    while (!cd.empty()) {
        if (b[ics2][igrec2]!=999999999) return true;
        p=cd.front(); x=p.first; y=p.second; cd.pop_front();
        for (k=0;k<=3;k++) if (b[x+dx[k]][y+dy[k]]>=b[x][y]+1) {
            b[x+dx[k]][y+dy[k]]=b[x][y]+1;
            cd.push_back(make_pair(x+dx[k], y+dy[k]));
        }
    }
    if (b[ics2][igrec2]!=999999999) return true; else return false;
}
int main(){
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d\n", &n, &m);
    for (i=1;i<=n;i++) {a[i][0]=-1; a[i][m+1]=-1; b[i][0]=-1; b[i][m+1]=-1;}
    for (i=1;i<=m;i++) {a[0][i]=-1; a[n+1][i]=-1; b[0][i]=-1; b[n+1][i]=-1;}
    for (i=1;i<=n;i++) {
        gets(s); for (j=0;j<m;j++) {
            if (s[j]=='.') a[i][j+1]=999999999;
            if (s[j]=='*') a[i][j+1]=-1;
            if (s[j]=='D') {a[i][j+1]=0; cd.push_back(make_pair(i,j+1));}
            if (s[j]=='I') {a[i][j+1]=999999999; ics1=i; igrec1=j+1;}
            if (s[j]=='O') {a[i][j+1]=999999999; ics2=i; igrec2=j+1;}
        }
    } dr=0;
    while (!cd.empty()) {
        dr++;
        while (!cd.empty()) {
            p=cd.front(); x=p.first; y=p.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;
                cd2.push_back(make_pair(x+dx[k], y+dy[k]));
            }
        } cd2.swap(cd); cd2.clear();
    }
    if (a[ics1][igrec1]<a[ics2][igrec2]) st=dr-a[ics2][igrec2]; else st=dr-a[ics1][igrec1]; sol=-1;
    for (mij=st+(dr-st)/2;st<dr;mij=st+(dr-st)/2) {
        if (test(mij)==true) {sol=mij; st=mij+1;}
            else dr=mij-1;
    }
    if (test(st)==true) sol=st;
    printf("%d\n", sol); return 0;
}