Pagini recente » Istoria paginii runda/fmi-no-stress-10 | Cod sursa (job #1098931) | Cod sursa (job #688645) | Cod sursa (job #3184987) | Cod sursa (job #25337)
Cod sursa(job #25337)
#include <stdio.h>
#define min(a,b) ((a) < (b) ? (a) : (b))
#define abs(x) ((x) < 0 ? (-(x)) : (x))
int N, M, P, D, res, afis;
int A[16][2];
int x[16], uz[16];
int cost(void)
{
int i, j, c, r = 0, d1, d2;
for(i = 1; i < P; i++)
{
d1 = A[x[i]][1], d2 = A[x[i+1]][1];
c = abs(A[x[i]][0]-A[x[i+1]][0])*D;
if(c == 0)
c += abs(d1-d2);
else
c += min(2*M+2-d1-d2, d1+d2);
r += c;
}
r += (A[x[1]][0]-1)*D+A[x[1]][1];
r += (N-A[x[P]][0])*D+A[x[P]][1];
return r;
}
void bkt(int k)
{
int i, s;
if(k == P+1)
{
s = cost();
if(s < res)
res = s;
}
else
for(i = 1; i <= P; i++)
if(!uz[i])
uz[i] = 1, x[k] = i, bkt(k+1), uz[i] = 0;
}
int main(void)
{
freopen("magazin.in", "rt", stdin);
freopen("magazin.out", "wt", stdout);
int i, j, k;
scanf("%d %d %d %d\n", &P, &N, &M, &D);
for(i = 1; i <= P; i++)
scanf("%d %d\n", &A[i][0], &A[i][1]);
res = 2000000000;
bkt(1);
printf("%d\n", res);
return 0;
}