PTA 团体程序设计天梯赛 15分题 085

L1-085 试试手气(15)

题目要求

PTA 团体程序设计天梯赛 15分题 085_第1张图片

我们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:

  • 1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;
  • 2、在满足条件 1 的前提下,每次都能让每个骰子得到可能得到的最大点数。

那么你应该可以预知自己第 n 次(1≤n≤5)摇出的结果。

输入格式

输入第一行给出 6 个骰子的初始点数,即 [1,6] 之间的整数,数字间以空格分隔;第二行给出摇的次数 n(1≤n≤5)。

输出格式 

在一行中顺序列出第 n 次摇出的每个骰子的点数。数字间必须以 1 个空格分隔,行首位不得有多余空格。

代码

#include 
#include 
#include  //find()头文件
using namespace std;

// 函数 gameNum 用于根据输入的初始点数和摇的次数生成结果
void gameNum(vector& num_vec, int N) {
    vector possible_values = {1, 2, 3, 4, 5, 6};
    vector> history;
    history.push_back(num_vec);

    for (int i = 0; i < N; ++i) {
        vector result(6);  // 存储本次摇骰子的结果
        for (int j = 0; j < 6; ++j) {  // 对 6 个骰子分别处理
            for (int k = 5; k >= 0; --k) {  // 从大到小检查可能的值
                bool found = false;
                for (const auto& prev_result : history) {  // 检查该值是否在之前的结果中出现过
                    if (prev_result[j] == possible_values[k]) {
                        found = true;
                        break;
                    }
                }
                if (!found) {  // 如果没出现过,将其作为本次结果
                    result[j] = possible_values[k];
                    break;
                }
            }
        }
        history.push_back(result);  // 将本次结果添加到历史结果中
    }

    // 输出第 N 次的结果
    for (int i = 0; i < 6; ++i) {
        if (i > 0) cout << " ";
        cout << history[N][i];
    }
    cout << endl;
}

int main() {
    int num, N;
    vector num_vec;
    for (int i = 0; i < 6; ++i) {
        cin >> num;
        num_vec.push_back(num);
    }
    cin >> N;
    gameNum(num_vec, N);
    return 0;
}

你可能感兴趣的:(PTA,团体程序设计天梯赛-练习集,算法,c++,开发语言,数据结构)