骰子

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值