Description
骰子是桌上游戏的小道具,中国的骰子习惯在一点和四点漆上红色。最常见的骰子是六面骰,它是一颗正立方体,上面分别有一到六个孔(或数字),其相对两面之数字和为七。
当骰子1在上,2在前时,右面是3,左面是4,后面是5,下面是6。这时记为(1,2,3,4,5,6),即(上,前,右,左,后,下)
现在骰子在一个4*4的方格上滚动,当向下滚动时后面朝上,当向右滚动时左面朝上,以此类推。骰子从左上角开始,只能朝右或朝下滚动,共滚动6次。给出最初的状态,请你找出滚动到右下角时,每次面的点数最大的值。
当开始上面的点数为1,前面的点数为2时,部分情况如下:
思路:
一个骰子有6个面,这里先用个数组存储骰子的状态
int state[6];
状态 例如(1,2,3,4,5,6),即(上,前,右,左,后,下)
L左翻转,R右翻转,F前翻转(下),B后翻转(上),A顺时针90°,C逆时针90°
上:0 前:1 右:2 左:3 后:4 下:5
向下滚动时后面朝上,当向右滚动时左面朝上
然后再写一个翻滚骰子的移动函数move(char ins),根据输入的指令每次翻转一次
void move(char ins){//移动,每次移动一次
int temp;
switch(ins){
case 'L':
temp = state[0]; //保存 上
state[0] = state[2]; //右->上
state[2] = state[5]; //上->左
state[5] = state[3]; //左->下
state[3] = temp; //下->右
break;
case 'R':
temp = state[0]; //保存 上
state[0] = state[3];
state[3] = state[5];
state[5] = state[2];
state[2] = temp;
break;
case 'F':
//向下
temp = state[0]; //保存 上
state[0] = state[4];
state[4] = state[5];
state[5] = state[1];
state[1] = temp;
break;
case 'B':
//向上
temp = state[0];
state[0] = state[1];
state[1] = state[5];
state[5] = state[4];
state[4] = temp;
break;
case 'A':
//顺时针
temp = state[1]; //保存前
state[1] = state[2];
state[2] = state[4];
state[4] = state[3];
state[3] = temp;
break;
case 'C':
//逆时针
temp = state[1]; //保存前
state[1] = state[3];
state[3] = state[4];
state[4] = state[2];
state[2] = temp;
break;
}
}
题目要求在4x4的方格种找出骰子从左上角到右上角“上点面”和的最大值,每次只能向右或者向下翻转,那么再写一个搜索的函数
void dfs(int i,int j,int num){
num += state[0];//加 上 的数
if(i==3&&j==3){
if(Max<num){
Max = num;
}
}
if(j<4){
move('R');
dfs(i,j+1,num);//向右
move('L');
}
if(i<4){
move('F');
dfs(i+1,j,num);//向下
move('B');
}
}
完整代码:
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int state[6];//状态 例如(1,2,3,4,5,6),即(上,前,右,左,后,下)
//L左翻转,R右翻转,F前翻转(下),B后翻转(上),A顺时针90°,C逆时针90°
//上:0 前:1 右:2 左:3 后:4 下:5
//向下滚动时后面朝上,当向右滚动时左面朝上
int Max;
void move(char ins){//移动,每次移动一次
int temp;
switch(ins){
case 'L':
temp = state[0]; //保存 上
state[0] = state[2]; //右->上
state[2] = state[5]; //上->左
state[5] = state[3]; //左->下
state[3] = temp; //下->右
break;
case 'R':
temp = state[0]; //保存 上
state[0] = state[3];
state[3] = state[5];
state[5] = state[2];
state[2] = temp;
break;
case 'F':
//向下
temp = state[0]; //保存 上
state[0] = state[4];
state[4] = state[5];
state[5] = state[1];
state[1] = temp;
break;
case 'B':
//向上
temp = state[0];
state[0] = state[1];
state[1] = state[5];
state[5] = state[4];
state[4] = temp;
break;
case 'A':
//顺时针
temp = state[1]; //保存前
state[1] = state[2];
state[2] = state[4];
state[4] = state[3];
state[3] = temp;
break;
case 'C':
//逆时针
temp = state[1]; //保存前
state[1] = state[3];
state[3] = state[4];
state[4] = state[2];
state[2] = temp;
break;
}
}
void dfs(int i,int j,int num){
num += state[0];//加 上 的数
if(i==3&&j==3){
if(Max<num){
Max = num;
}
}
if(j<4){
move('R');
dfs(i,j+1,num);//向右
move('L');
}
if(i<4){
move('F');
dfs(i+1,j,num);//向下
move('B');
}
}
int main(int argc, char *argv[]) {
while(cin>>state[0]){
for(int i=1;i<6;i++){
cin>>state[i];
}
Max = -99999;
dfs(0,0,0);//向右
dfs(0,0,0);//向下
cout<<Max<<endl;
}
return 0;
}
Input
输入包含若干行,每行一种表示骰子初始状态。
Ouput
输出对应的最大值。
Sample Input
1 2 3 4 5 6
6 5 3 4 2 1
Sample Output
26
27