1 条题解
-
0
题意分析
Chun-Soo正在玩一个骰子堆叠游戏。每个骰子有六个面,分别标有数字1到6。这些骰子不是标准的,即对面数字之和不一定是7。 游戏规则: 将多个骰子按顺序堆叠,骰子1在最底部。 每对相邻骰子的接触面必须具有相同的数字。 堆叠后,通过旋转骰子,可以自由设置顶面和底面,但其他四个面必须保持垂直。 目标: 找到一种堆叠方式,使得一个侧面的数字总和最大。
输入: 第一行包含一个整数 t,表示测试用例的数量。 每个测试用例的第一行包含一个整数 n,表示骰子的数量。 接下来的 n 行,每行包含六个整数,表示一个骰子的六个面。 输出: 每个测试用例应有一行输出,其中包含一个侧面的最大数字总和。
解题思路
1.理解骰子的面: 每个骰子有六个面,分别用0到5索引表示。函数用于找到与面 x 相对的面。
2.计算最大侧面和: 对于每个可能的底面(0到5),尝试将骰子堆叠起来。计算除顶面和底面外的最大面值。找到下一个骰子的底面,使得其与当前骰子的顶面匹配。
3.模拟堆叠过程: 从第一个骰子开始,选择一个底面。对于每个后续的骰子,找到其底面,使得其与前一个骰子的顶面匹配。累加每个骰子的最大侧面值。
4.更新最大值: 对于每个可能的底面,计算堆叠后的侧面总和。更新最大侧面总和。
代码实现
#include<cstdio> using namespace std; int dice[10000][10]; int t, n; int op(int x){ switch(x){ case 0: return 5; case 1: return 3; case 2: return 4; case 3: return 1; case 4: return 2; case 5: return 0; } } int maxside(int arr[], int bottom, int top){ int max = 0; for(int i=0; i<6; i++){ if(i!=bottom && i!=top) if(arr[i]>max) max = arr[i]; } return max; } int find(int arr[], int x){ for(int i=0; i<6; i++){ if(arr[i]==x) return i; } } int main(){ int sum, maximum, bottom, top; scanf("%d", &t); while(t--){ maximum = 0; scanf("%d", &n); for(int i=0; i<n; i++) for(int j=0; j<6; j++) scanf("%d", &dice[i][j]); for(int i=0; i<6; i++){ sum = 0; bottom = i; for(int j=0; j<n; j++){ top = op(bottom); sum += maxside(dice[j], bottom, top); if(j<n-1) bottom = find(dice[j+1], dice[j][top]); } if(sum>maximum) maximum = sum; } printf("%d\n", maximum); } return 0; }
- 1
信息
- ID
- 973
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者