Cod sursa(job #637475)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 20 noiembrie 2011 14:40:12
Problema Portal3 Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 4.96 kb
#include <stdio.h>
#define MAXIM 1005

int pozitie=MAXIM-1;
char buff[MAXIM];//citesc bucati de cate maxim 10005 caractere

void cit(int &nr){
    nr=0;
    while(buff[pozitie]<'0' || buff[pozitie]>'9')//cat timp nu e cifra, treci mai departe
        if (++pozitie==MAXIM){
            fread (buff,1,MAXIM,stdin);
            pozitie=0;
        }
    while('0'<=buff[pozitie] && buff[pozitie]<='9'){//cat timp e cifra
        nr=nr*10+buff[pozitie]-'0';
        if (++pozitie==MAXIM){
            fread (buff,1,MAXIM,stdin);
            pozitie=0;
        }
     }
}

struct nod{
   int x1,y1,x2,y2,c;
}portal[5];//sunt 3 portale

struct tri{
   int sens1,sens2,sens3;
}triplete[30];//vor fi 27 de triplete

struct p{
   int a,b,c;
}permutari[10];//vor fi 6 permutari  

void init(){
   int i,j,k,t=0;
  //init triplete 
  for(i=-1;i<=1;i++)
     for(j=-1;j<=1;j++)
       for(k=-1;k<=1;k++){
              triplete[t].sens1=i;
              triplete[t].sens2=j;
              triplete[t].sens3=k;
              t++;
        }
  //init permutari[] cu toate perm multimii {0,1,2}
  permutari[0].a=0;
  permutari[0].b=1;
  permutari[0].c=2;

  permutari[1].a=0;
  permutari[1].b=2;
  permutari[1].c=1;

  permutari[2].a=1;
  permutari[2].b=0;
  permutari[2].c=2;

  permutari[3].a=1;
  permutari[3].b=2;
  permutari[3].c=0;

  permutari[4].a=2;
  permutari[4].b=0;
  permutari[4].c=1;

  permutari[5].a=2;
  permutari[5].b=1;
  permutari[5].c=0;



}

inline int distanta(int a, int b, int x, int y){
   //dist de la (a,b) la (x,y)
   int dist=0;
   if(a<x)dist+=x-a;
      else dist+=a-x;
   if(b<y)dist+=y-b;
      else dist+=b-y;
   return dist;
}

int main(){
  int t;
  int i;
  int n,m;
  init();
  freopen("portal3.in","r",stdin);
  FILE *fout=fopen("portal3.out","w");
  cit(t);
  //scanf("%d",&t);
  int j,k;
  int a,b,c,pozcx, pozcy;//pozitia curenta
  long long dist;
  int distmin=0;
  int portal0,portal1,portal2;
  for(i=0;i<t;i++){
      cit(n);
      cit(m);
      //scanf("%d%d",&n,&m);     
      for(j=0;j<3;j++){//a j-lea portal
          cit(portal[j].x1);
          cit(portal[j].y1);
          cit(portal[j].x2);
          cit(portal[j].y2);
          cit(portal[j].c);
          //scanf("%d%d%d%d%d",&portal[j].x1,&portal[j].y1,&portal[j].x2,&portal[j].y2,&portal[j].c);     

       }
       distmin=2000000010;
    //incep sa rezolv problema
    for(j=0;j<27;j++){//iau fiecare triplet
          //printf("(%d,%d,%d),",triplete[j].sens1,triplete[j].sens2,triplete[j].sens3);       
       for(k=0;k<6;k++){//fiecare permutare a sa
          portal0=permutari[k].a;
          portal1=permutari[k].b;
          portal2=permutari[k].c;

          a=triplete[j].sens1;
          b=triplete[j].sens2;
          c=triplete[j].sens3;
          //printf("(%d,%d,%d),",permutari[k].a,permutari[k].b,permutari[k].c);       
          //merg pe jos din (0,0) pana la un portal
          pozcx=0;pozcy=0;
          dist=0;
          //situatia portalului 1
          if(a==-1){//a dif de 0, inseamna ca consider portalul 1, luat in sens invers
              //merg pe jos pana la gura 2 a primului portal
              dist+=distanta(pozcx,pozcy,portal[portal0].x2,portal[portal0].y2)+portal[portal0].c;
              pozcx=portal[portal0].x1;
              pozcy=portal[portal0].y1;
          }else if(a==1){//luat in sensul in care se cere
              //merg pe jos pana la gura 1 a primului portal           
              dist+=distanta(pozcx,pozcy,portal[portal0].x1,portal[portal0].y1)+portal[portal0].c;
              pozcx=portal[portal0].x2;
              pozcy=portal[portal0].y2;
          }

          //situatia portalului 2
          if(b==-1){//a dif de 0, inseamna ca consider portalul 2, luat in sens invers
              //merg pe jos pana la gura 2 a celui de-al doilea portal
              dist+=distanta(pozcx,pozcy,portal[portal1].x2,portal[portal1].y2)+portal[portal1].c;
              pozcx=portal[portal1].x1;
              pozcy=portal[portal1].y1;
          }else if(b==1){//luat in sensul in care se cere
              //merg pe jos pana la gura 2 a primului portal           
              dist+=distanta(pozcx,pozcy,portal[portal1].x1,portal[portal1].y1)+portal[portal1].c;
              pozcx=portal[portal1].x2;
              pozcy=portal[portal1].y2;
          }

          //situatia portalului 2
          if(c==-1){
              dist+=distanta(pozcx,pozcy,portal[portal2].x2,portal[portal2].y2)+portal[portal2].c;
              pozcx=portal[portal2].x1;
              pozcy=portal[portal2].y1;
          }else if(c==1){//luat in sensul in care se cere
              //merg pe jos pana la gura 1 a primului portal           
              dist+=distanta(pozcx,pozcy,portal[portal2].x1,portal[portal2].y1)+portal[portal2].c;
              pozcx=portal[portal2].x2;
              pozcy=portal[portal2].y2;
          }
         //din pozcx,pozcy merg pe jos pana la n,m
          dist+=distanta(pozcx,pozcy,n,m);
          if(dist<distmin)distmin=dist;
       }
    }
    fprintf(fout,"%d\n",distmin);     
}
  
  

return 0;
}