题目
我们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:
1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;
2、在满足条件 1 的前提下,每次都能让每个骰子得到可能得到的最大点数。
输入格式
输入第一行给出 6 个骰子的初始点数,即 [1,6] 之间的整数,数字间以空格分隔;第二行给出摇的次数 n(1≤n≤5)。
输出格式
在一行中顺序列出第 n 次摇出的每个骰子的点数。数字间必须以 1 个空格分隔,行首位不得有多余空格。
输入样例
3 6 5 4 1 4
3
输出样例
4 3 3 3 4 3
样例解释
三次的输出结果如下:
6 5 6 6 6 6
5 4 4 5 5 5
4 3 3 3 4 3
代码
代码如下:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int a[7] = {0} ; //数组a装6个骰子的初始的点数
int b[7];
int n;
for (int i = 0; i < 6; i++)
{
cin >> b[i];
a[i] = b[i];
}
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 6; j++)
{
if (i == 0)//第一次摇骰子
{
if (b[j] != 6)
{
b[j] = 6;//如果初始值不是6,就赋值为6
}
else
{
b[j]--;//如果初始值是6,就在6的基础上-1
}
}
else if (i != 0)//第一次结束以后
{
if (b[j] - 1 == a[j]) //摇出来的点数和初始的点数相同
{
b[j] = b[j] - 2;//就在第一次摇出来的点数的基础上再-1,相当于在初始值的基础上-2
}
else
{
b[j]--;//
}
}
}
}
for (int i = 0; i < 6; i++)
{
if (i < 5)
{
cout << b[i] << " ";
}
else
{
cout << b[i] <<endl;
}
}
return 0;
}
总结
老实说,我开始在没看样例解释之前,我都不知道输出样例为啥是这几个数,首先,我们需要把初始值留着与后面摇到的点数进行比较,就是一整个数学思维。