Cod sursa(job #1453331)

Utilizator DjokValeriu Motroi Djok Data 23 iunie 2015 11:53:04
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<bits/stdc++.h>
using namespace std;

typedef struct lol {
    int x,y;
}troll;

const int dx[]={-1,0,1,0};
const int dy[]={0,1,0,-1};

int i,j,st=1e9,dr,n,m,pivot,rs=-1,b[1005][1005],viz[1005][1005];
bool a[1005][1005];
char c;
troll q[1000005],gmb,fnc,aux;

bool Check(int x) {
    int st,dr,i;

    if(b[gmb.x][gmb.y]<x) return 0;

    memset(a,0,sizeof(a));

    for(st=dr=1;st<=dr;++st)
    {
      if(q[st].x==fnc.x && q[st].y==fnc.y) return 1;

      for(i=0;i<4;++i)
      if(viz[q[st].x+dx[i]][q[st].y+dy[i]]==1)
      {
        aux.x=q[st].x+dx[i]; aux.y=q[st].y+dy[i];
        if(a[aux.x][aux.y]) continue;
        if(b[aux.x][aux.y]>=x) q[++dr].x=aux.x,q[dr].y=aux.y;
        a[aux.x][aux.y]=1;
      }
    }

    return 0;
}

int main()
{
  ifstream cin("barbar.in");
  ofstream cout("barbar.out");

  ios_base::sync_with_stdio(0);

  cin>>n>>m;
  for(i=1;i<=n;++i)
   for(j=1;j<=m;++j)
   {
     cin>>c;
     if(c=='D') viz[i][j]=-1,q[++dr].x=i,q[dr].y=j;
     if(c=='*') viz[i][j]=-1;
     if(c=='I') gmb.x=i,gmb.y=j;
     if(c=='O') fnc.x=i,fnc.y=j;
   }

  for(i=0;i<=n+1;++i) viz[i][0]=viz[i][m+1]=-1;
  for(i=0;i<=m+1;++i) viz[0][i]=viz[n+1][i]=-1;

  for(st=1;st<=dr;++st)
   for(i=0;i<4;++i)
   if(!viz[q[st].x+dx[i]][q[st].y+dy[i]])
   {
     aux.x=q[st].x+dx[i]; aux.y=q[st].y+dy[i];
     viz[aux.x][aux.y]=1;
     q[++dr].x=aux.x; q[dr].y=aux.y;
     b[aux.x][aux.y]=b[q[st].x][q[st].y]+1;
   }

  st=0; dr=n+m;

  while(st<=dr)
  {
    pivot=(st+dr)/2; q[1]=gmb;
    if(Check(pivot)) rs=max(rs,pivot),st=pivot+1;
    else dr=pivot-1;
  }

  cout<<rs<<'\n';

 return 0;
}