们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件: 1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同; 2、在满足条件 1 的前提下,每次都能让每个骰子得到可能得到的最大点数。 那么你应该可以预知自己第 n 次(1≤n≤5)摇出的结果。 输入格式: 输入第一行给出 6 个骰子的初始点数,即 [1,6] 之间的整数,数字间以空格分隔;第二行给出摇的次数 n(1≤n≤5)。 输出格式: 在一行中顺序列出第 n 次摇出的每个骰子的点数。数字间必须以 1 个空格分隔,行首位不得有多余空格。c++完整代码
时间: 2024-01-21 15:18:19 浏览: 88
```cpp
#include <iostream>
using namespace std;
const int N = 6;
int dice[N], ans[N];
bool st[N];
// 计算每个骰子可能的最大点数
int get_max(int x)
{
int res = 0;
for (int i = 1; i <= 6; i++)
if (i != x && i != 7 - x)
res = max(res, i);
return res;
}
// 模拟摇骰子过程
void roll(int n)
{
for (int i = 0; i < N; i++)
ans[i] = dice[i];
for (int i = 0; i < N; i++)
{
if (!st[i]) // 如果这个骰子没有被选过
{
int max_num = get_max(ans[i]); // 计算最大点数
for (int j = 0; j < N; j++)
if (j != i && ans[j] == max_num) // 找到与这个骰子不同的最大点数的骰子
swap(ans[i], ans[j]); // 交换
}
}
for (int i = 0; i < N; i++)
dice[i] = ans[i];
if (n == 1)
{
for (int i = 0; i < N; i++)
cout << dice[i] << ' ';
cout << endl;
return;
}
for (int i = 0; i < N; i++)
{
if (!st[i])
{
st[i] = true;
roll(n - 1);
st[i] = false;
}
}
}
int main()
{
for (int i = 0; i < N; i++)
cin >> dice[i];
int n;
cin >> n;
roll(n);
return 0;
}
```
阅读全文