Cod sursa(job #478535)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 19 august 2010 00:05:08
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.87 kb
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
typedef struct{int x,y;} matrice;
matrice start,stop;
std::queue<matrice>c;
bool ok;
int dragon[1005][1005],n,m,maxim,viz[1005][1005];
char a[1005][1005];
void bfs(void)
{
  int i,j;
  matrice elem;
  while(!c.empty())
  {
     elem=c.front();
     c.pop();
     i=elem.x; j=elem.y;
     if((!dragon[i+1][j]) && (a[i+1][j]=='.')) { dragon[i+1][j]=dragon[i][j]+1; elem.x=i+1; elem.y=j; c.push(elem);}
     if((!dragon[i-1][j]) && (a[i-1][j]=='.')) { dragon[i-1][j]=dragon[i][j]+1; elem.x=i-1; elem.y=j; c.push(elem);  }
     if((!dragon[i][j+1]) && (a[i][j+1]=='.')) { dragon[i][j+1]=dragon[i][j]+1; elem.x=i; elem.y=j+1; c.push(elem); }
     if((!dragon[i][j-1]) && (a[i][j-1]=='.')) { dragon[i][j-1]=dragon[i][j]+1; elem.x=i; elem.y=j-1; c.push(elem);  }
  }

}
int bf(int dist)
{
  int i,j;
  matrice nod,elem;
  memset(viz,0,sizeof(viz));
  c=std::queue<matrice>();
  if(dragon[start.x][start.y]<dist) return 0;
  c.push(start);
  viz[start.x][start.y]=1;
  while(!c.empty())
  {
    nod=c.front();
    i=nod.x; j=nod.y;
    c.pop();
    if((dragon[i+1][j]>=dist)&&(!viz[i+1][j])&&(a[i+1][j]!='*')) { viz[i+1][j]=1; elem.x=i+1; elem.y=j; c.push(elem); if(elem.x==stop.x && elem.y==stop.y) break; }
    if((dragon[i-1][j]>=dist)&&(!viz[i-1][j])&&(a[i-1][j]!='*')) { viz[i-1][j]=1; elem.x=i-1; elem.y=j; c.push(elem); if(elem.x==stop.x && elem.y==stop.y) break;}
    if((dragon[i][j+1]>=dist)&&(!viz[i][j+1])&&(a[i][j+1]!='*')) { viz[i][j+1]=1; elem.x=i; elem.y=j+1; c.push(elem);if(elem.x==stop.x && elem.y==stop.y) break; }
    if((dragon[i][j-1]>=dist)&&(!viz[i][j-1])&&(a[i][j-1]!='*')) { viz[i][j-1]=1; elem.x=i; elem.y=j-1; c.push(elem); if(elem.x==stop.x && elem.y==stop.y)break;}
  }
  if(viz[stop.x][stop.y]) return 1; else return 0;
}
int main()
{
    int i,j,st,dr,mij;
    matrice el;
    ifstream fi("barbar.in");
    ofstream fo("barbar.out");
    memset(viz,0,sizeof(viz));
    fi>>n>>m;
    for(i=1;i<=n;i++)
      for(j=1;j<=m;j++)
       {
         fi>>a[i][j];
         if(a[i][j]=='I') { start.x=i; start.y=j; a[i][j]='.';}
         if(a[i][j]=='O') {stop.x=i; stop.y=j; a[i][j]='.';}
         if(a[i][j]=='D') el.x=i,el.y=j, c.push(el);
       }
    bfs();
    maxim=0;
    for(i=1;i<=n;i++)
      for(j=1;j<=m;j++)
        if(dragon[i][j] && dragon[i][j] >maxim) maxim=dragon[i][j];
    st=1; dr=maxim;
    ok=1;
    while(st<dr)
    {
      if(st==dr-1 && st!=1)
      {
        if(bf(dr)) fo<<dr<<"\n"; else
        if(bf(st)) fo<<st<<"\n"; else
        fo<<"-1\n";
        ok=0;
        break;
      }
      mij=(st+dr)/2;
      if(bf(mij))
      st=mij;
      else dr=mij-1;
    }

    if((st==1)&&ok&&(bf(1))) fo<<"1\n"; else
    if((st==1)&&ok&&(bf(0))) fo<<"0\n"; else
    if((st!=1)&&ok) fo<<st<<"\n";

    fo.close();
    return 0;
}