Pagini recente » Cod sursa (job #1430925) | Cod sursa (job #636039) | Cod sursa (job #1605925) | Cod sursa (job #982518) | Cod sursa (job #1503058)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define k 6
using namespace std;
int n, q, i, j, m, t;
long long c[k], sol, dp[1 << k + 1][k];
struct portal
{
int x;
int y;
int z;
int t;
}p[k];
void rsw()
{
freopen("portal3.in", "r", stdin);
freopen("portal3.out", "w", stdout);
scanf("%d", &t);
while (t --)
{
scanf("%d %d", &n, &m);
sol = m + n;
j = 0;
for (i = 0; i < 3; ++ i)
scanf("%d %d %d %d %d", &p[i].x, &p[i].y, &p[i].z, &p[i].t, &c[i]);
for (i = 3; i < 6; ++ i)
{
p[i] = p[i - 3];
swap(p[i].x, p[i].z);
swap(p[i].y, p[i].t);
c[i] = c[i - 3];
}
for (i = 0; i < 1 << k; ++ i)
for (j = 0; j < k; ++ j)
if (i & (1 << j))
{
if (i == 1 << j)
dp[i][j] = c[j] + p[j].x + p[j].y;
else
{
dp[i][j] = m + n;
for (q = 0; q < k; ++ q)
if (i & (1 << q) && q != j)
if (dp[i][j] > c[j] + dp[i ^ (1 << j)][q] + abs(p[q].z - p[j].x) + abs(p[q].t - p[j].y))
dp[i][j] = c[j] + dp[i ^ (1 << j)][q] + abs(p[q].z - p[j].x) + abs(p[q].t - p[j].y);
}
if (sol > dp[i][j] + abs(n - p[j].z) + abs(m - p[j].t))
sol = dp[i][j] + abs(n - p[j].z) + abs(m - p[j].t);
}
printf("%lld\n", sol);
}
}
int main()
{
rsw();
return 0;
}