Cod sursa(job #203426)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 16 august 2008 12:42:34
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <fstream>
#include <queue>
using namespace std;
#define mp make_pair
#define x first
#define y second
const int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int R,C,xp,yp,b[1001][1001];
char a[1001][1001];
queue< pair<int,int> > q;
void read(){
     int i,j,k;
     ifstream f("barbar.in");
     f>>R>>C;
     for (i=1;i<=R;++i)
      for (j=1;j<=C;++j){
       f>>a[i][j];
       if (a[i][j]=='D') q.push(mp(i,j));
       if (a[i][j]=='I') xp=i,yp=j;
       }
     while (!q.empty()){
           i=q.front().x;
           j=q.front().y;
           q.pop();
           for (k=0;k<4;++k)
            if (i+dx[k]<=R && i+dx[k]>=1)
             if (j+dy[k]<=C && j+dy[k]>=1)
              if (a[i+dx[k]][j+dy[k]]!='*')
               if (a[i+dx[k]][j+dy[k]]!='D')
               if (b[i+dx[k]][j+dy[k]]==0){
                 b[i+dx[k]][j+dy[k]]=b[i][j]+1;
                 q.push(mp(i+dx[k],j+dy[k]));}
           }
     }
bool u[1001][1001];
int IsSolution(int D){
    int i,j,k;
    while (!q.empty()) q.pop();
    memset(u,false,sizeof(u));
    q.push(mp(xp,yp));
    u[xp][yp]=true;
    while (!q.empty()){
          i=q.front().x;
          j=q.front().y;
          q.pop();
          for (k=0;k<4;++k)
            if (i+dx[k]<=R && i+dx[k]>=1)
             if (j+dy[k]<=C && j+dy[k]>=1)
              if (!u[i+dx[k]][j+dy[k]])
               if (b[i+dx[k]][j+dy[k]]>=D)
                if (a[i+dx[k]][j+dy[k]]!='*'){
                 u[i+dx[k]][j+dy[k]]=true;
                 q.push(mp(i+dx[k],j+dy[k]));
                 if (a[i+dx[k]][j+dy[k]]=='O') return 1;
                 }
          }
    return 0;
    }           
void solve(){
     int ls=0,ld=b[xp][yp],mij,sol=-1;
     ofstream g("barbar.out");
     while (ls<=ld){
           mij=(ls+ld)/2;
           if (IsSolution(mij)) sol=mij,ls=mij+1;
             else ld=mij-1;
           }
     g<<sol;
     }
int main(){
    read();
    solve();
    return 0;
}