Cod sursa(job #342882)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 24 august 2009 02:20:55
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <cstdlib>
#include <utility>
#include <queue>
#include <cstring>
#include <cstdio>
#define not_allowed 999999999
#define draggon 0
#define N 1010
int a[N][N];
int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int main ()
{int r,c,i,j;
 int ls,cs,lf,cf,lt,ct,lu,cu,flag,flag2,min;
 char linie[10002];
 std::queue<std::pair<int,int> > q1,q2,*pq1=&q1,*pq2=&q2,*aux;
 FILE *f,*fout;
 for (i=0;i<N;i++)
 {for(j=0;j<N;j++)
  {a[i][j]=1000000000;
  }
 }
 printf("%d",a[0][0]);
 freopen("error.txt","w",stderr);
 if((f=fopen("barbar.in","r"))==NULL)
 {return 0;
 }
 if((fout=fopen("barbar.out","w"))==NULL)
 {return 0;
 }
 fscanf(f,"%d %d\n",&r,&c);



for (i=0;i<r;i++)
 {fscanf(f,"%s",linie);

  for (j=0;j<c;j++)
  {
   if(linie[j]=='*')a[i+1][j+1]=not_allowed;

   else if(linie[j]=='D')
   {a[i+1][j+1]=draggon;
    pq1->push(std::pair<int,int>(i+1,j+1));
   }
   else if(linie[j]=='I')ls=i+1,cs=j+1;
   else if(linie[j]=='O')lf=i+1,cf=j+1;

  }
 }

 do
 {flag=0;
  while(!pq1->empty())
  {lt=pq1->front().first;
   ct=pq1->front().second;
   pq1->pop();
//   fprintf(fout,"tata %d %d\n",lt,ct);
   for (i=0;i<4;i++)
   {lu=lt+d[i][0];
    cu=ct+d[i][1];
    if(0<lu&&lu<=c&&0<cu&&cu<=r&&
       a[lu][cu]!=not_allowed&&
       a[lt][ct]+1<a[lu][cu])
    {flag=1;
     a[lu][cu]=a[lt][ct]+1;
     pq2->push(std::pair<int,int>(lu,cu));
  //   fprintf(fout,"  fiu %d %d\n",lt+d[i][0],ct+d[i][1]);
    }
   }

  }
  aux=pq1;pq1=pq2;pq2=aux;
 }
 while(flag);

while(!pq1->empty())pq1->pop();
while(!pq2->empty())pq2->pop();
min=a[ls][cs];
a[ls][cs]=-1;
pq1->push(std::pair<int,int>(ls,cs));
do
{flag=0;flag2=0;
 while(!pq1->empty())
 {lt=pq1->front().first;
  ct=pq1->front().second;
  pq1->pop();
  for (i=0;i<4;i++)
  {lu=lt+d[i][0];
   cu=ct+d[i][1];
   if(0<lu&&lu<=c&&0<cu&&cu<=r&&
      a[lu][cu]!=-1&&a[lu][cu]!=not_allowed&&a[lu][cu]!=0)
   {flag2=1;
    if(lu==lf&&cu==cf){flag=1;break;}
    if(a[lu][cu]>=min)
    {pq1->push(std::pair<int,int>(lu,cu));
     a[lu][cu]=-1;
    }
    else
    {pq2->push(std::pair<int,int>(lu,cu));
    }
   
   }

  }
  if(flag==1)break;
 }
 aux=pq1;pq1=pq2;pq2=aux;
 if(flag==1)
  break;
 else
  min--;
}
while(flag2);
if(flag2!=0)
 fprintf(fout,"%d\n",min);
else
 fprintf(fout,"-1");

/*for (i=0;i<r;i++)
 {for (j=0;j<c;j++)
  {if(a[i+1][j+1]==999999)
    fprintf(fout,"x ");
   else
    fprintf(fout,"%d ",a[i+1][j+1]);
  }
  fprintf(fout,"\n");
  
 }*/
 return 0;
}