Cod sursa(job #478694)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 19 august 2010 20:38:47
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.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];
const int dx[]={-1,1,0,0}, dy[]={0,0,1,-1};

void bfs(void)
{
  int i,j,d;
  matrice elem;
  while(!c.empty())
  {
     elem=c.front();
     c.pop();
     i=elem.x; j=elem.y;
     for(d=0;d<4;d++)
          if((!dragon[i+dx[d]][j+dy[d]]) && (a[i+dx[d]][j+dy[d]]=='.')) { dragon[i+dx[d]][j+dy[d]]=dragon[i][j]+1; elem.x=i+dx[d]; elem.y=j+dy[d]; c.push(elem);}
  }

}
int bf(int dist)
{
  int i,j,d;
  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();
    for(d=0;d<4;d++)
          if((dragon[i+dx[d]][j+dy[d]]>=dist) && (a[i+dx[d]][j+dy[d]]=='.' or a[i+dx[d]][j+dy[d]]=='D') && (!viz[i+dx[d]][j+dy[d]])) {viz[i+dx[d]][j+dy[d]]=1;  elem.x=i+dx[d]; elem.y=j+dy[d]; c.push(elem); if(elem.x==stop.x && elem.y==stop.y) break;}
    }
  if(viz[stop.x][stop.y]==1) return 1; else return 0;
}
int main()
{
  int i,j;
  matrice el;
  int dr,st,mij;
    ifstream fi("barbar.in");
    ofstream fo("barbar.out");
    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();

    st=0; dr=n*m;
    while (dr-st>1)
    {
        mij=(st+dr)>>1;
        if (bf(mij)) st=mij;
        else dr=mij;
    }
    if(st) fo<<st<<"\n";
    else if(bf(0)) fo<<"0\n"; else fo<<"-1\n";

    fo.close();
    return 0;
}