pku1972 Dice Stacking

 比较简单的题

在第一个骰子放法固定之后,第二个骰子的底面值必须和第一个骰子的顶面值一样,所以第二个骰子的底面是一定的,将与底面相邻的4个面的最大值转出来,同理,将第三个骰子的与底面相邻的4个面中的最大值转出来,这样可以得到第一个骰子放置方式固定后的面最大值。

第一个骰子的放置方式有6种,取这6个放置方式的面最大值就是解。

代码比较WS。。

 

#include <stdio.h> #include <memory.h> int nface, nvalue; int value[6]; bool order[6]; int dies[10001][6]; #define max(a, b) ((a)>(b)?(a):(b)) int setorder(int curface) { memset(order, 1, sizeof(order)); if (curface==0 || curface==5) { order[0] = false; order[5] = false; return 5-curface; } if (curface==1 || curface==3) { order[1] = false; order[3] = false; return 4-curface; } if (curface==2 || curface==4) { order[2] = false; order[4] = false; return 6-curface; } return -1; } int getface(int curdie, int value) { int i; for(i=0; i<6; i++) { if (dies[curdie][i] == value) return i; } return -1; } int main() { int i, j, k, t, n, tmp, maxvalue; scanf("%d", &t); while (t--) { scanf("%d", &n); for (i=1; i<=n; i++) scanf("%d%d%d%d%d%d", &dies[i][0], &dies[i][1], &dies[i][2], &dies[i][3], &dies[i][4], &dies[i][5]); memset(value, 0, sizeof(value)); for (maxvalue=0, i=0; i<6; i++) { nvalue = i+1; for (j=1; j<=n; j++) { nface = setorder(getface(j, nvalue)); nvalue = dies[j][nface]; for (tmp=0, k=0; k<6; k++) { if (order[k] && dies[j][k]>tmp) tmp = dies[j][k]; } value[i] += tmp; } maxvalue = max(maxvalue, value[i]); } printf("%d/n", maxvalue); } }

你可能感兴趣的:(pku1972 Dice Stacking)