//第四届蓝桥杯软件类省赛真题-C-A-2_骰子迷题.cpp
/*
标题:骰子迷题
小明参加了少年宫的一项趣味活动:每个小朋友发给一个空白的骰子
(它的6个面是空白的,没有数字),要小朋友自己设计每个面写哪个数字。
但有如下要求:
1. 每个面只能填写 0 至 8 中的某一个数字。
2. 不同面可以填写同样的数字,但6个面总和必须等于24。
填好后,小朋友可以用自己填写好数字的骰子向少年宫的两个机器人挑战
----玩掷骰子游戏。规则如下:
三方同时掷出自己的骰子,如果出现任何相同的数字,则三方都不计分。
如果三方数字都不同,则最小数字一方扣 1 分,最大数字一方加 1 分。
小明看到了两个机器人手中的骰子分别是:
0 0 0 8 8 8
1 1 4 5 6 7
请你替小明算一下,他如何填写,才能使自己得分的概率最大。
请提交小明应该填写的6个数字,按升序排列,数字间用一个空格分开。
如果认为有多个答案,提交字母序最小的那个方案。
请严格按照格式,通过浏览器提交答案。
注意:只提交一行内容,含有6个被空格分开的数字。不要写其它附加内容,
比如:说明性的文字。
*/
/*【解题思路】
解法:暴力枚举或深搜。
此题刚开始看可能觉得有点难,但静下心来想,理顺思路,这题也不难。
根据排列组合的相关知识可得三方同时掷出自己的骰子,总共会出现 6*6*6 = 216
种情况。且小明要得分,则掷出自己的骰子后,
出现的骰子数字应同时大于 机器人1和机器人2 骰子上的数字。
(可画个组合的树图理解)
综上,小明得分概率等价于在出现的216种组合情况中,
小明的骰子出现的数字同时大于 机器人1和机器人2 骰子上的数字的情况数win,再来除于216。
即概率P = win/6*6*6。
编程中可舍去分母 6*6*6,变成求win的最大值。
总之,解法就是搜索所有满足数字和为 24 的数字组合,
然后计算这些组合中各个组合的得分概率,找出最大的即为满足题意的组合。
答案:
2 2 2 2 8 8
*/
/********深度优先搜索算法********/
#include<iostream>
using namespace std;
int a[6];//用于表示小明骰子上的六面数字
int b[6];//用于记录满足题意条件小明骰子上的六面数字
int robot1[6] = {0,0,0,8,8,8};//用于表示机器人1骰子上的六面数字
int robot2[6] = {1,1,4,5,6,7};//用于表示机器人2骰子上的六面数字
int maxCount = 0;
/*
*@简介:计算当前骰子上的6个数,即当前组合中能赢的情况数
*@参数:无
*@返回:当前骰子上的6个数中能赢的情况数
*/
int coutWinSituation()
{
int win = 0;
for(int i = 0;i<6;i++){
for(int j = 0;j<6;j++){
for(int k = 0;k<6;k++){
if(a[i]>robot1[j] && a[i]>robot2[k]){
win++;
}
}
}
}
return win;
}
void dfs(int step)
{
if(step == 6){
int sum = 0;
for(int i = 0;i<6;i++)
sum += a[i];
if(sum == 24){
int win = coutWinSituation();
//如果当前数字组合赢的情况数大于以往数字组合赢的情况数,则交换记录,保存
//此步主要是找出满足题意条件的情况
if(win > maxCount){
maxCount = win;
for(int i = 0;i<6;i++){
b[i] = a[i];
}
}
}
return;
}
for(int i = 0;i<=8;i++){
a[step] = i;
dfs(step+1);
}
return;
}
int main()
{
dfs(0);
cout<<"小明应该填写的6个数字为:"<<endl;
for(int i = 0;i<6;i++){
cout<<b[i]<<" ";
}
return 0;
}
/********暴力枚举法********/
//#include<iostream>
//using namespace std;
//
//int a[6];//用于表示小明骰子上的六面数字
//int b[6];//用于记录满足题意条件小明骰子上的六面数字
//int robot1[6] = {0,0,0,8,8,8};//用于表示机器人1骰子上的六面数字
//int robot2[6] = {1,1,4,5,6,7};//用于表示机器人2骰子上的六面数字
//
//int maxCount = 0;
//
///*
// *@简介:计算当前骰子上的数大于机器人上各个面的数的情况组合数
// *@参数:无
// *@返回:当前骰子上的数大于机器人上各个面的数的情况数
//*/
//int coutWinSituation()
//{
// int win = 0;
// for(int i = 0;i<6;i++){
// for(int j = 0;j<6;j++){
// for(int k = 0;k<6;k++){
// if(a[i]>robot1[j] && a[i]>robot2[k]){
// win++;
// }
//
// }
// }
// }
// return win;
//}
//
//int main()
//{
// for(a[0] = 0;a[0]<=8;a[0]++)
// for(a[1] = 0;a[1]<=8;a[1]++)
// for(a[2] = 0;a[2]<=8;a[2]++)
// for(a[3] = 0;a[3]<=8;a[3]++)
// for(a[4] = 0;a[4]<=8;a[4]++)
// for(a[5] = 0;a[5]<=8;a[5]++){
//
// int sum = 0;
// for(int i = 0;i<6;i++)
// sum += a[i];
//
// if(sum == 24){
// int win = coutWinSituation();
// if(win > maxCount){
// maxCount = win;
//
// //将当前数组值记录备份保存
// for(int i = 0;i<6;i++){
// b[i] = a[i];
// }
// }
// }
//
// }
// cout<<"小明应该填写的6个数字为:"<<endl;
//
// for(int i = 0;i<6;i++){
// cout<<b[i]<<" ";
// }
//
// return 0;
//}
第四届蓝桥杯软件类省赛真题-C-A-2_骰子迷题
最新推荐文章于 2020-07-31 19:16:54 发布