聊城做网站做的不错的网络公司/代发关键词排名包收录
题目大意:
分析:
预处理出每个面的相对面,以及四个方向走的时候面的位置的变化情况
设dpi,j,k,l,mdp_{i,j,k,l,m}dpi,j,k,l,m表示到了位置(i,j)(i,j)(i,j),上面是kkk,前面是lll,右边是mmm时的最小总和
然后用spfa更新即可
最初的骰子的前后上右下左分别对应1,2,3,4,5,6
k,l,m∈k,l,m∈k,l,m∈{1,2,3,4,5,61,2,3,4,5,61,2,3,4,5,6},即当前筛子的面是最初骰子的哪个面
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#include <cstring>
#include <algorithm>#define inf 0x3f3f3f3f
#define N 10using namespace std;const int dx[4] = {-1, 1, 0, 0};
const int dy[4] = {0, 0, -1, 1};
int Pre[5][7], dp[N][N][7][7][7], cost[N], a[7], b[7], ax, ay, bx, by;
char a1[5], a2[5];
bool vis[N][N][7][7][7];queue <int> px, py, g1, g2, g3;int Get_num(int x)
{if (x == 1) return 2;if (x == 2) return 1;if (x == 3) return 5;if (x == 5) return 3;if (x == 4) return 6;if (x == 6) return 4;
}bool check(int xx, int yy)
{if (xx < 1 || xx > 8 || yy < 1 || yy > 8) return 0;return 1;
}void spfa()
{// 前后上右下左 for (int i = 1; i <= 8; i++)for (int j = 1; j <= 8; j++) for (int k = 1; k <= 6; k++)for (int l = 1; l <= 6; l++) for (int z = 1; z <= 6; z++) dp[i][j][k][l][z] = inf;dp[ax][ay][3][1][4] = cost[5]; //12 35 46 走到(i,j)上面是k,前面是l 右边是z vis[ax][ay][3][1][4] = 1;px.push(ax); py.push(ay); g1.push(3); g2.push(1); g3.push(4);while (px.size()){int ux = px.front(); px.pop();int uy = py.front(); py.pop();int u1 = g1.front(); g1.pop();int u2 = g2.front(); g2.pop();int u3 = g3.front(); g3.pop();a[1] = u2, a[2] = Get_num(u2);a[3] = u1, a[5] = Get_num(u1);a[4] = u3, a[6] = Get_num(u3);for (int i = 0; i < 4; i++){int vx = ux + dx[i];int vy = uy + dy[i];for (int j = 1; j <= 6; j++) b[Pre[i][j]] = a[j];if (check(vx, vy)){if (dp[ux][uy][u1][u2][u3] + cost[a[Pre[i][0]]] < dp[vx][vy][b[3]][b[1]][b[4]]){dp[vx][vy][b[3]][b[1]][b[4]] = dp[ux][uy][u1][u2][u3] + cost[a[Pre[i][0]]];if (!vis[vx][vy][b[3]][b[1]][b[4]]){vis[vx][vy][b[3]][b[1]][b[4]] = 1;px.push(vx); py.push(vy);g1.push(b[3]); g2.push(b[1]); g3.push(b[4]); } }}}vis[ux][uy][u1][u2][u3] = 0;}
}void Pre_Work()
{// 前后上右下左 Pre[0][1] = 5, Pre[0][2] = 3, Pre[0][3] = 1, Pre[0][4] = 4, Pre[0][5] = 2, Pre[0][6] = 6, Pre[0][0] = 1; //上 Pre[1][1] = 3, Pre[1][2] = 5, Pre[1][3] = 2, Pre[1][4] = 4, Pre[1][5] = 1, Pre[0][6] = 6, Pre[1][0] = 2; //下Pre[2][1] = 1, Pre[2][2] = 2, Pre[2][3] = 6, Pre[2][4] = 3, Pre[2][5] = 4, Pre[2][6] = 5, Pre[2][0] = 6; //左Pre[3][1] = 1, Pre[3][2] = 2, Pre[3][3] = 4, Pre[3][4] = 5, Pre[3][5] = 6, Pre[3][6] = 3, Pre[3][0] = 4; //右
}int main()
{ Pre_Work();scanf("%s %s", a1, a2);for (int i = 1; i <= 6; i++) scanf("%d", &cost[i]); ay = a1[0] - 'a' + 1, ax = a1[1] - '0';by = a2[0] - 'a' + 1, bx = a2[1] - '0';spfa();int ans = inf;for (int i = 1; i <= 6; i++) for (int j = 1; j <= 6; j++) for (int k = 1; k <= 6; k++) ans = min(ans, dp[bx][by][i][j][k]); printf("%d\n", ans);
}