news 2026/4/17 5:11:31

(新卷,200分)- 连续出牌数量(Java JS Python C)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(新卷,200分)- 连续出牌数量(Java JS Python C)

(新卷,200分)- 连续出牌数量(Java & JS & Python & C)

题目描述

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

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

输入描述

输入为两行

  • 第一行是每张手牌的数字,数字由空格分隔,
  • 第二行为对应的每张手牌的颜色,用r y b g这4个字母分别代表4种颜色,字母也由空格分隔。

手牌数量不超过10。

输出描述

输出一个数字,即最多能打出的手牌的数量。

用例
输入1 4 3 4 5
r y b b r
输出3
说明

如果打(1, r)-> (5, r),那么能打两张。

如果打(4,y) -> (4, b) -> (3, b),那么能打三张。

输入1 2 3 4
r y b l
输出1
说明没有能够连续出牌的组合,只能在开始时打出一张手牌,故输出1
题目解析

本题连续出牌的条件是:

如果玩家手中有和他上一次打出的手牌颜色或者数字相同的手牌,他可以继续将该手牌打出

因此,我们可以基于回溯算法,来求解不同的出牌方式,而下张牌是否可出的条件是:

  • 和上一张牌的数字相同,或者和上一张牌的颜色相同
JS算法源码
/* JavaScript Node ACM模式 控制台输入获取 */ const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines = []; rl.on("line", (line) => { lines.push(line); if (lines.length === 2) { const nums = lines[0].split(" "); const colors = lines[1].split(" "); console.log(getMaxCount(nums, colors)); lines.length = 0; } }); class Card { constructor(num, color) { this.num = num; this.color = color; } } function getMaxCount(nums, colors) { const n = nums.length; const cards = []; for (let i = 0; i < n; i++) { cards[i] = new Card(nums[i], colors[i]); } const ans = [0]; const used = new Array(n).fill(false); dfs(cards, used, undefined, 0, ans); return ans[0]; } function dfs(cards, used, last, count, ans) { ans[0] = Math.max(ans[0], count); for (let i = 0; i < cards.length; i++) { if (used[i]) continue; const cur = cards[i]; if (last && last.num != cur.num && last.color != cur.color) continue; used[i] = true; dfs(cards, used, cur, count + 1, ans); used[i] = false; } }
Java算法源码
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray(); String[] colors = sc.nextLine().split(" "); System.out.println(getResult(nums, colors)); } static class Card { int num; char color; public Card(int num, String color) { this.num = num; this.color = color.charAt(0); } } public static int getResult(int[] nums, String[] colors) { int n = nums.length; Card[] cards = new Card[n]; for (int i = 0; i < n; i++) cards[i] = new Card(nums[i], colors[i]); int[] ans = {0}; boolean[] used = new boolean[n]; dfs(cards, used, null, 0, ans); return ans[0]; } public static void dfs(Card[] cards, boolean[] used, Card last, int count, int[] ans) { ans[0] = Math.max(ans[0], count); for (int i = 0; i < cards.length; i++) { if (used[i]) continue; Card cur = cards[i]; if (last != null && last.num != cur.num && last.color != cur.color) continue; used[i] = true; dfs(cards, used, cur, count + 1, ans); used[i] = false; } } }
Python算法源码
# 输入获取 nums = input().split() colors = input().split() def dfs(cards, used, last, count, ans): ans[0] = max(ans[0], count) for i in range(len(cards)): if used[i]: continue cur = cards[i] if last and last.num != cur.num and last.color != cur.color: continue used[i] = True dfs(cards, used, cur, count + 1, ans) used[i] = False class Card: def __init__(self, num, color): self.num = num self.color = color # 算法入口 def getResult(): n = len(nums) cards = [Card(nums[i], colors[i]) for i in range(n)] ans = [0] used = [False] * n dfs(cards, used, None, 0, ans) return ans[0] # 算法调用 print(getResult())
C算法源码
#include <stdio.h> #define MAX(a,b) ((a) > (b) ? (a) : (b)) #define MAX_SIZE 10 typedef struct { int num; char color; } Card; // 记录题解 int ans = 0; // 记录输入的卡牌信息 Card cards[MAX_SIZE]; int cards_size = 0; // 回溯求解所有出牌情况 void dfs(int used[], Card* last, int count); int main() { while (scanf("%d", &cards[cards_size].num)) { cards_size++; if (getchar() != ' ') break; } for (int i = 0; i < cards_size; i++) { cards[i].color = (char) getchar(); getchar(); } // 记录哪些牌使用过了 int used[MAX_SIZE] = {0}; dfs(used, NULL, 0); printf("%d\n", ans); return 0; } void dfs(int used[], Card* last, int count) { ans = MAX(ans, count); for(int i=0; i<cards_size; i++) { // 如果当前牌已经使用过,则不能出牌 if(used[i]) continue; // 当前牌 Card cur = cards[i]; // 如果 和上一张牌的数字不同,且和上一张牌的颜色也不同,则不能出牌 if(last != NULL && last->num != cur.num && last->color != cur.color) continue; used[i] = 1; dfs(used, &cur, count + 1); used[i] = 0; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 18:43:53

SenseVoice语音AI部署实战:从零到生产环境的完整指南

SenseVoice语音AI部署实战&#xff1a;从零到生产环境的完整指南 【免费下载链接】SenseVoice Multilingual Voice Understanding Model 项目地址: https://gitcode.com/gh_mirrors/se/SenseVoice SenseVoice作为新一代多语言语音理解模型&#xff0c;集成了语音识别、情…

作者头像 李华
网站建设 2026/4/17 5:33:39

Grafana终极实战:从零搭建专业级DevOps监控仪表盘

Grafana终极实战&#xff1a;从零搭建专业级DevOps监控仪表盘 【免费下载链接】devops-exercises bregman-arie/devops-exercises: 是一系列 DevOps 练习和项目&#xff0c;它涉及了 Docker、 Kubernetes、 Git、 MySQL 等多种技术和工具。适合用于学习 DevOps 技能&#xff0c…

作者头像 李华
网站建设 2026/4/16 9:58:38

python学习第五周

打开文件&#xff1a; try:f open("C:/Users/25770/PycharmProjects/PythonProject7/day0108/files/1",r)print(f.read()) finally:if f:f.close()可以简写为&#xff1a; with open("C:/Users/25770/PycharmProjects/PythonProject7/day0108/files/1") …

作者头像 李华
网站建设 2026/4/17 18:37:17

完美卸载HeyGem.ai的终极指南

完美卸载HeyGem.ai的终极指南 【免费下载链接】HeyGem.ai 项目地址: https://gitcode.com/GitHub_Trending/he/HeyGem.ai 想要完全清理HeyGem.ai却不知从何下手&#xff1f;这份详细的卸载教程将为你提供从基础操作到深度清理的完整解决方案。作为一款功能丰富的AI应用…

作者头像 李华
网站建设 2026/4/16 18:34:45

macOS游戏修改终极秘籍:Bit-Slicer让你的游戏体验开挂升级

macOS游戏修改终极秘籍&#xff1a;Bit-Slicer让你的游戏体验开挂升级 【免费下载链接】Bit-Slicer Universal game trainer for macOS 项目地址: https://gitcode.com/gh_mirrors/bi/Bit-Slicer &#x1f3ae; 还在为游戏卡关而烦恼吗&#xff1f;想要在macOS上实现无限…

作者头像 李华
网站建设 2026/4/17 22:33:36

Linux系统Zotero DEB包安装全攻略:让文献管理更简单高效

Linux系统Zotero DEB包安装全攻略&#xff1a;让文献管理更简单高效 【免费下载链接】zotero-deb Packaged versions of Zotero and Juris-M for Debian-based systems 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-deb 还在为Linux系统上安装文献管理软件而头疼…

作者头像 李华