Cod sursa(job #1170250)

Utilizator timicsIoana Tamas timics Data 12 aprilie 2014 23:49:32
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include<stdio.h>
#include<queue>
#include<iostream>
using namespace std;
int N,M,d[1010][1010], startX, endX, startY, endY;
int dx[]={0,0,1,-1}, dy[]={1,-1,0,0};
char c;
bool viz[1010][1010];
queue<int> q;

void reset_viz() {
    for(int i=0;i<N;++i) {
        for(int j=0;j<M;++j) {
            viz[i][j]=0;
        }
    }
}

bool dfs(int x, int y, int D) {
    viz[x][y]=1;
    
    bool ret=false;

    for(int i=0;i<4;++i) {
        if(x+dx[i]==endX && y+dy[i]==endY) {
            //cout<<"JFHSJ";
            return true;
        }
        if(x+dx[i]>=0 && x+dx[i]<N && y+dy[i]>=0 && y+dy[i]<M) {
            if(!viz[x+dx[i]][y+dy[i]] && d[x+dx[i]][y+dy[i]]>=D) {
               ret = ret || dfs(x+dx[i],y+dy[i],D);
            }
        }
    }
    return ret;
}

bool good(int D) {
    return dfs(startX,startY,D);
}

int caut() {
    int st = 0, dr = min(d[startX][startY],d[endX][endY]);
    int ret = -1;
    while(st<=dr) {
        int mij = (st+dr)/2;
        //cout<<st<<" "<<dr<<endl;
        reset_viz();
        //cout<<good(mij)<<endl;
        if(good(mij)) {
            ret = mij;
            st = mij+1;
        } else {
            dr = mij-1;
        }
    }
    return ret;
}

int main() {
   // freopen("input.in","r",stdin);
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int i=0;i<N;++i) {
        scanf("%c",&c);
        for(int j=0;j<M;++j) {
            scanf("%c",&c);
            if(c=='I') {
                startX = i;
                startY = j;
            }
            if(c=='O') {
                endX = i;
                endY = j;
            }

            if(c=='D') {
                d[i][j]=0;
                q.push(i*N+j);
            } else if(c=='*') {
                d[i][j]=-2;
            } else {
                d[i][j]=-1;
            }
        }
      //  printf("\n");
    }

    while(!q.empty()) {
        int curr = q.front(), x = curr/N, y = curr%N;
        q.pop();
        for(int i=0;i<4;++i) {
            if(x+dx[i]>=0 && x+dx[i]<N && y+dy[i]>=0 && y+dy[i]<M) {
                if(d[x+dx[i]][y+dy[i]]==-1) {
                   d[x+dx[i]][y+dy[i]]=d[x][y]+1; 
                   q.push((x+dx[i])*N + (y+dy[i]));
                }
            }
        }
   }
  //  printf("%d",good(2));
   printf("%d",caut());

//   printf("%d",d[endX][endY]);

   /* for(int i=0;i<N;++i) {
        for(int j=0;j<M;++j) {
            printf("%d ",d[i][j]);
        }
        printf("\n");
    }*/
    return 0;
}