题目:
我们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。
下面给你 6 个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。
假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:
1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;
|
那么你应该可以预知自己第 n 次( 1 ≤ n ≤ 5 ) 摇出的结果。
输入/输出要求:
输入格式:
第一行:给出 6个骰子的初始点数,即 [ 1 , 6 ] 之间的整数,数字间以空格分隔; 第二行:给出摇的次数 n ( 1 ≤ n ≤ 5 )。 |
输出格式:
在一行中顺序列出第n次摇出的每个骰子的点数。 数字间必须以 1 个空格分隔,行首位不得有多余空格。 |
样例输入/输出:
输入样例:
3 6 5 4 1 4 3 |
输出样例:
4 3 3 3 4 3 |
思路:
这一题,需要注意去理解题目意思以及所给出的条件。
1、 给出 6 个骰子的初始面
int original[6];
2、每个骰子摇出的点数都跟它之前任何一次出现的点数不同。
所以使最后要出来的每个骰子尽量最大点数。
int ans[6];
// 因为还没开始投掷,所以注意要全部初始化为 7,使得后面的投掷尽量得到最大点数 6
for(int i = 0;i < 6;i++){
ans[i] = 7;
}
3、开始投掷
for (int i = 0; i < n; i++) {
for (int j = 0; j < 6; j++) {
// 开始投掷,使每个骰子尽量得到最大点数 6
ans[j]--;
if (ans[j] == original[j]) {
// 如果与初始的面数相同了,那就让它尽量不同,得到其最大的点数
ans[j]--;
}
}
}
解题源码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int original[6];
for (int i = 0; i < 6; i++) {
cin >> original[i];
}
int n;
cin >> n;
int ans[6];
for (int i = 0; i < 6; i++) {
// 因为还没开始投掷,所以注意要全部初始化为 7,使得后面的投掷尽量得到最大点数 6
ans[i] = 7;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < 6; j++) {
// 开始投掷,使每个骰子尽量得到最大点数 6
ans[j]--;
if (ans[j] == original[j]) {
// 如果与初始的面数相同了,那就让它尽量不同,得到其最大的点数
ans[j]--;
}
}
}
for (int i = 0; i < 6; i++) {
if (!i)
cout << ans[i];
else
cout << ' ' << ans[i];
}
return 0;
}
最后提交: