Cod sursa(job #1170294)

Utilizator timicsIoana Tamas timics Data 13 aprilie 2014 01:15:51
Problema Barbar Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 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 ret,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;
        }
    }
}

void bfs(int D) {
//   cout<<"AA"<<endl; 
    queue<int> q;
    q.push(startX*M + startY);
    
    while(!q.empty()) {
   //     cout<<q.size()<<endl;
        int curr = q.front(), x = curr/M, y = curr%M;
        viz[x][y]=1;
        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(x+dx[i]==endX && y+dy[i]==endY) {
                    ret = true;
                    return;
                }
                if(!viz[x+dx[i]][y+dy[i]] && d[x+dx[i]][y+dy[i]]>=D) {
                   q.push((x+dx[i])*M + (y+dy[i]));
                }
            }
        }   
   }    
}
 

int caut() {
    int st = 0, dr = min(d[startX][startY],d[endX][endY]);
    int r = -1;
    while(st<=dr) {
        int mij = (st+dr)/2;
        reset_viz();
        ret = 0;
       bfs(mij);
        if(ret) {
            r = mij;
            st = mij+1;
        } else {
            dr = mij-1;
        }
    }
    return r;
}
 
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*M+j);
            } else if(c=='*') {
                d[i][j]=-2;
            } else {
                d[i][j]=-1;
            }
        }
    }
 
    while(!q.empty()) {
        int curr = q.front(), x = curr/M, y = curr%M;
        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])*M + (y+dy[i]));
                }
            }
         }
    }
    printf("%d",caut());
    return 0;
}