Cod sursa(job #25645)

Utilizator stef2nStefan Istrate stef2n Data 4 martie 2007 13:17:04
Problema Magazin Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define infile "magazin.in"
#define outfile "magazin.out"
#define PMAX 50005
#define INF 1000000000

FILE *fin,*fout;
struct poz{int x,y;};
poz p[PMAX];
int P,N,M,D;
int bestsol=INF;
int st[PMAX],used[PMAX];
int suma;

void citire()
  {
   int i;
   fin=fopen(infile,"r");
   fscanf(fin,"%d %d %d %d",&P,&N,&M,&D);
   for(i=0;i<P;i++)
      fscanf(fin,"%d %d",&p[i].x,&p[i].y);
   fclose(fin);
  }

inline int min(int x, int y)
  {
   return (x<y)?x:y;
  }

inline int dist_min(int x1, int y1, int x2, int y2)
  {
   if(x1==x2)
     return abs(y1-y2);
   return min(abs(x1-x2)*D+(M-y1+1)+(M-y2+1),abs(x1-x2)*D+(y1)+(y2));
  }
/*
void constr_retea()
  {
   int i,j;
   


  }
*/

void back(int k)
  {
   if(k==P)
     {
      // verificare
      if(st[0]==1 && st[1]==2 && st[2]==3)
        int ok=1;
suma=0;
suma+=dist_min(1,0,p[st[0]].x,p[st[0]].y);
for(int i=1;i<P;i++)
   suma+=dist_min(p[st[i-1]].x,p[st[i-1]].y,p[st[i]].x,p[st[i]].y);
suma+=dist_min(N,0,p[st[P-1]].x,p[st[P-1]].y);
    //  suma+=dist_min(N,0,p[st[k-1]].x,p[st[k-1]].y);
      if(suma<bestsol)
        bestsol=suma;
//      suma-=dist_min(N,0,p[st[k-1]].x,p[st[k-1]].y);
      return;
     }
   if(!k)
     suma=0;
   for(st[k]=0;st[k]<P;st[k]++)
      if(!used[st[k]])
        {
         used[st[k]]=1;
         if(!k)
           suma+=dist_min(1,0,p[st[k]].x,p[st[k]].y);
         else
           suma+=dist_min(p[st[k-1]].x,p[st[k-1]].y,p[st[k]].x,p[st[k]].y);
         back(k+1);
         if(!k)
           suma-=dist_min(1,0,p[st[k]].x,p[st[k]].y);
         else
           suma-=dist_min(p[st[k-1]].x,p[st[k-1]].y,p[st[k]].x,p[st[k]].y);
         used[st[k]]=0;
        }
  }


int main()
{
citire();
//constr_retea();
for(int i=0;i<P;i++)
   used[i]=0;
back(0);

fout=fopen(outfile,"w");
fprintf(fout,"%d\n",bestsol);
fclose(fout);
return 0;
}