机试题——连续出牌数量

题目描述

有这么一款单人卡牌游戏,牌面由颜色和数字组成,颜色为红、黄、蓝、绿中的一种,数字为0-9中的一个。游戏开始时玩家从手牌中选取一张卡牌打出,接下来如果玩家手中有和他上一次打出的手牌颜色或者数字相同的手牌,他可以继续将该手牌打出,直至手牌打光或者没有符合条件可以继续打出的手牌。

现给定一副手牌,请找到最优的出牌策略,使打出的手牌最多。

输入描述

输入为两行:

  • 第一行是手牌的数字,每张卡牌的数字由空格分隔。
  • 第二行是手牌对应的颜色,颜色由 r(红)、y(黄)、b(蓝)、g(绿)四个字母组成,字母之间用空格分隔。

手牌的数量不超过10。

输出描述

输出一个整数,表示最多能够打出的手牌的数量。

用例输入

输入:

1 4 3 4 5 
r y b b r
3

说明:可以按照(4, y)-> (4, b) -> (3, b) 的顺序打出3张牌。

输入:

1 2 3 4 
r y b l
1

说明:没有任何连续的出牌组合,最多只能打出1张牌。

解题思路

  1. 问题理解

    • 需要根据手牌的颜色或数字,寻找可以连续打出的手牌数量。每次出牌后,下一张牌必须与上一次出牌的颜色或数字匹配才能继续打出。
  2. 回溯与递归

    • 使用回溯算法(DFS)来递归选择每一张手牌,尝试找到最多能够连续打出的手牌数量。
    • 对于每一张当前牌,如果与上一次打出的牌的颜色或数字相匹配,则可以继续打出。
    • 我们用递归来尝试从每张卡牌出发,逐步计算最多能打出的手牌数量。
  3. 避免重复

    • 通过 used 数组标记哪些卡牌已经被打过,避免在同一次递归中重复打出同一张卡牌。
  4. 递归返回的值

    • 递归的返回值表示当前从某一张卡牌出发,最多能够打出的手牌数量。每次递归时,我们尝试从当前卡牌出发继续出牌,直到没有符合条件的卡牌可以打出为止。
  5. 优化

    • 每次递归时不直接加上当前手牌,而是通过递归计算剩余手牌的数量。
    • 每次出牌后,恢复 used 数组,确保其他路径的递归不受影响。

代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
vector<int> numbers;
vector<char> colors;
vector<bool> used(100, false);
// 上一张牌的数字,上一张牌的颜色
int dfs(int last_num, char last_col) {
    int max_count = 0;
    for (int i = 0; i < numbers.size(); ++i) {
        if (!used[i] && (numbers[i] == last_num || colors[i] == last_col)) {
            used[i] = true;
            max_count = max(max_count, 1 + dfs(numbers[i], colors[i]));
            used[i] = false;
        }
    }
    return max_count;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    string num_input, color_input;

    getline(cin, num_input); // 读取数字行
    getline(cin, color_input); // 读取颜色行

    // 解析输入
    stringstream ss_num(num_input), ss_color(color_input);
    int num;
    char color;
    while (ss_num >> num) {
        numbers.push_back(num);
    }
    while (ss_color >> color) {
        colors.push_back(color);
    }

    int n = numbers.size();
    int res = 1;
    for (int i = 0; i < n; ++i) {
        // 从第i张卡牌开始
        used[i] = true;
        res = max(res, 1 + dfs(numbers[i], colors[i]));
        used[i] = false;
    }
    cout << res << "\n";
}

你可能感兴趣的:(#,hw机试题,算法,c++)