Problem 1174 Dice Stacking.
题意
- die - 模具
dice - 骰子
- 垒骰子,相贴的两面数值相等
- 输入:
测试数据组数 t (1 <= t <= 11)
骰子数量n (1 <= n <= 10,000),n个骰子对应的面值
- 输出:
数字最大的那一面的数字和
思路
- 对每个骰子,底面固定后顶面也固定,只要取他们侧面的最大面值累加即可
- 第一个骰子的底面有6种可能,对每个底面求出该情况下的最大侧面值
- 结果取这6个最大值中值最大的那个
代码
#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;
}