Cod sursa(job #478522)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 18 august 2010 23:11:37
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
typedef struct{int x,y;} matrice;
matrice start,stop;
std::queue<matrice>c;
bool viz[1005][1005];
int dragon[1005][1005],n,m,maxim;
char a[1005][1005];
void bfs(int i,int j)
{
  if((dragon[i+1][j]>dragon[i][j]+1) && (a[i+1][j]=='.')) { dragon[i+1][j]=dragon[i][j]+1;bfs(i+1,j); }
  if((dragon[i-1][j]>dragon[i][j]+1) && (a[i-1][j]=='.')) { dragon[i-1][j]=dragon[i][j]+1; bfs(i-1,j); }
  if((dragon[i][j+1]>dragon[i][j]+1) && (a[i][j+1]=='.')) { dragon[i][j+1]=dragon[i][j]+1; bfs(i,j+1); }
  if((dragon[i][j-1]>dragon[i][j]+1) && (a[i][j-1]=='.')) { dragon[i][j-1]=dragon[i][j]+1; bfs(i,j-1); }
}
bool 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;
    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];
         dragon[i][j]=int(2e9);
         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]='.';}
       }
    maxim=0;
    for(i=1;i<=n;i++)
      for(j=1;j<=m;j++)
        if(a[i][j]=='D') {dragon[i][j]=0; bfs(i,j); }
    for(i=1;i<=n;i++)
      for(j=1;j<=m;j++)
        if(dragon[i][j]!=int(2e9) && dragon[i][j] >maxim) maxim=dragon[i][j];
    st=1; dr=maxim;
    while(st<dr)
    {
      if(st==dr-1)
      {
        if(bf(dr)) fo<<dr<<"\n"; else fo<<st<<"\n";
        break;
      }
      mij=(st+dr)/2;
      if(bf(mij))
      st=mij;
      else dr=mij-1;
    }
    if(st!=dr-1)
    {
    if(st==1)
    {
    if(bf(1))
    fo<<"1\n";
    else if(bf(0)) fo<<"0\n"; else fo<<"-1\n";
    } else fo<<st<<"\n";
    }
    fo.close();
    return 0;
}