Pagini recente » Cod sursa (job #360732) | Cod sursa (job #438398) | Cod sursa (job #955341) | Cod sursa (job #2939050) | Cod sursa (job #636267)
Cod sursa(job #636267)
#include <stdio.h>
#include <string.h>
struct pos
{
long long x, y;
};
struct portal
{
pos x0, x1;
long long d;
} x[5];
long long min, st[5], N, M, f[4];
inline long long ab (long long x)
{
if (x > 0)
return x;
return x * (-1);
}
inline long long dist (long long x0, long long y0, long long x1, long long y1)
{
return ab (x0 - x1) + ab (y0 - y1);
}
void solve (int k)
{
int i, mask, lim, lastx = 0, lasty = 0;
long long time = 0;
portal now[10];
memset (now, 0, sizeof (now));
lim = 1 << k;
for (i = 1; i <= k; i ++)
now[i] = x[st[i]];
for (mask = 0; mask < lim; mask ++)
{
time = 0; lastx = 0; lasty = 0;
for (i = 1; i <= k; i ++)
if ((mask & (1 << (i - 1))) == 0)
{
time = time + dist (lastx, lasty, now[i].x0.x, now[i].x0.y) + now[i].d;
lastx = now[i].x1.x; lasty = now[i].x1.y;
}
else
{
time = time + dist (lastx, lasty, now[i].x1.x, now[i].x1.y) + now[i].d;
lastx = now[i].x0.x; lasty = now[i].x0.y;
}
time = time + dist (lastx, lasty, N, M);
if (time < min)
min = time;
}
}
void Back (int k)
{
int i;
for (i = 1; i <= 3; i ++)
if (!f[i])
{
st[k] = i;
f[i] = 1;
solve (k);
Back (k + 1);
f[i] = 0;
}
}
int main ()
{
int T, i;
freopen ("portal3.in", "r", stdin);
freopen ("portal3.out", "w", stdout);
scanf ("%d", &T);
while (T --)
{
memset (st, 0, sizeof (st));
memset (f, 0, sizeof (f));
scanf ("%lld%lld", &N, &M);
for (i = 1; i <= 3; i ++)
scanf ("%lld%lld%lld%lld%lld", &x[i].x0.x, &x[i].x0.y, &x[i].x1.x, &x[i].x1.y, &x[i].d);
min = N + M;
Back (1);
printf ("%lld\n", min);
}
return 0;
}