java解法

每张牌包含值 (val) 和 颜色 (col)。
牌链的规则:
相邻的牌,必须满足值相同或颜色相同。
解题步骤
读取输入

第一行输入为整数数组 vals,代表所有牌的值。
第二行输入为字符串数组 cols,代表所有牌的颜色。
创建 Tile 类

Tile 类存储每张牌的值和颜色。
回溯搜索 (DFS)

采用**回溯 + 深度优先搜索(DFS)**遍历所有可能的排列,计算最长合法链的长度。
变量说明:
vis[]:布尔数组,标记当前牌是否被使用。
prev:表示当前牌链中的上一张牌。
maxChain[0]:存储最长牌链的长度。
递归 search() 方法

遍历所有牌,尝试加入牌链:
如果当前牌 cur 和上一张牌 prev 不符合值或颜色相同的规则,则跳过。
标记 vis[i] = true,递归搜索下一张牌。
回溯 (vis[i] = false),撤销选择,继续搜索其他可能路径。
最终返回 maxChain[0] 作为最长合法牌链的长度

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 读取第一行输入(牌的值)并转换为整数数组
        int[] vals = Arrays.stream(sc.nextLine().split(" "))
                           .mapToInt(Integer::parseInt)
                           .toArray();

        // 读取第二行输入(牌的颜色)并存储为字符串数组
        String[] cols = sc.nextLine().split(" ");

        // 计算最长合法牌链
        System.out.println(calc(vals, cols));
    }

    // 定义Tile类,表示每张牌
    static class Tile {
        int val; // 牌的值
        char col; // 牌的颜色(用字符表示)

        public Tile(int val, String col) {
            this.val = val;
            this.col = col.charAt(0); // 取颜色字符串的第一个字符
        }
    }

    // 计算最长合法牌链
    public static int calc(int[] vals, String[] cols) {
        int len = vals.length;
        Tile[] tiles = new Tile[len];

        // 创建牌的数组,每张牌由值和颜色组成
        for (int i = 0; i < len; i++) {
            tiles[i] = new Tile(vals[i], cols[i]);
        }

        int[] maxChain = {0}; // 存储最长牌链长度
        boolean[] vis = new boolean[len]; // 记录哪些牌已经使用

        // 进行深度优先搜索(DFS)
        search(tiles, vis, null, 0, maxChain);

        return maxChain[0]; // 返回最长牌链的长度
    }

    // 递归搜索最长的合法牌链
    public static void search(Tile[] tiles, boolean[] vis, Tile prev, int len, int[] maxChain) {
        // 更新最长牌链长度
        maxChain[0] = Math.max(maxChain[0], len);

        // 遍历所有牌,尝试加入牌链
        for (int i = 0; i < tiles.length; i++) {
            if (vis[i]) continue; // 如果该牌已被使用,则跳过

            Tile cur = tiles[i];

            // 如果前一张牌存在,检查是否符合连续条件 (值相同 或 颜色相同)
            if (prev != null && prev.val != cur.val && prev.col != cur.col) continue;

            // 选择该牌,并继续搜索
            vis[i] = true;
            search(tiles, vis, cur, len + 1, maxChain);
            vis[i] = false; // 回溯,撤销选择
        }
    }
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C++解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C解法

每张牌包含数字 (num) 和 颜色 (color)。
牌链的规则:
相邻的牌,必须满足数字相同或颜色相同。
解题步骤
读取输入

先读取一行整数,表示牌的数字,存入 cards[i].num。
然后读取一行字符,表示牌的颜色,存入 cards[i].color。
深度优先搜索(DFS)

使用 bfs()(其实是递归深度优先搜索,函数命名 bfs 可能是误导)。
变量说明:
used[]:布尔数组,标记当前牌是否被使用。
lastCard:表示当前牌链中的上一张牌。
maxCount:存储最长牌链的长度。
递归 bfs() 计算最长合法牌链

遍历所有牌:
如果当前牌 current 和 lastCard 不符合数字或颜色相同的规则,则跳过。
标记 used[i] = 1,递归搜索下一张牌。
回溯 (used[i] = 0),撤销选择,继续搜索其他可能路径。
最终返回 maxCount 作为最长合法牌链的长度

#include 
#include 

#define MAX_SIZE 10 // 假设最多 10 张牌

// 结构体表示一张牌
typedef struct {
    int num;    // 牌的数字
    char color; // 牌的颜色
} Card;

int maxCount = 0; // 记录最长牌链的长度
Card cards[MAX_SIZE]; // 存储牌组
int cardsSize = 0; // 牌的总数量

void dfs(int used[], Card* lastCard, int count); // 递归搜索函数

int main() {
    // 读取牌的数字
    while (scanf("%d", &cards[cardsSize].num)) {
        cardsSize++;
        if (getchar() != ' ') break; // 遇到换行,停止读取
    }

    // 读取牌的颜色
    for (int i = 0; i < cardsSize; i++) {
        cards[i].color = (char)getchar(); // 读取字符颜色
        getchar(); // 跳过空格或换行
    }

    int used[MAX_SIZE] = {0}; // 记录哪些牌已被使用
    dfs(used, NULL, 0); // 开始深度优先搜索

    printf("%d\n", maxCount); // 输出最长合法牌链长度
    return 0;
}

// 递归搜索最长牌链
void dfs(int used[], Card* lastCard, int count) {
    // 更新最长牌链的长度
    if (count > maxCount) {
        maxCount = count;
    }

    // 遍历所有牌,尝试加入牌链
    for (int i = 0; i < cardsSize; i++) {
        if (used[i]) continue; // 如果该牌已被使用,跳过

        Card current = cards[i];

        // 如果 lastCard 存在,检查是否符合连续规则(数字相同 或 颜色相同)
        if (lastCard == NULL || lastCard->num == current.num || lastCard->color == current.color) {
            used[i] = 1; // 标记该牌为已使用
            dfs(used, &current, count + 1); // 递归搜索
            used[i] = 0; // 回溯,撤销选择
        }
    }
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/145184745"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!