首页 > 编程语言 >连续出牌数量 思路+代码(华为OD-C卷-200分-Python解法)

连续出牌数量 思路+代码(华为OD-C卷-200分-Python解法)

时间:2024-07-11 19:25:43浏览次数:8  
标签:200 used 打出 Python OD 手牌 num ans cards

题目描述

有这么一款单人卡牌游戏,牌面由颜色和数字组成,颜色为红、黄、蓝、绿中的一种,数字为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

题目解析

本题连续出牌的条件是:

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

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

  • 和上一张牌的数字相同,或者和上一张牌的颜色相同

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())

 题目描述

有这么一款单人卡牌游戏,牌面由颜色和数字组成,颜色为红、黄、蓝、绿中的一种,数字为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

题目解析

本题连续出牌的条件是:

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

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

  • 和上一张牌的数字相同,或者和上一张牌的颜色相同

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())

 题目描述

有这么一款单人卡牌游戏,牌面由颜色和数字组成,颜色为红、黄、蓝、绿中的一种,数字为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

题目解析

本题连续出牌的条件是:

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

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

  • 和上一张牌的数字相同,或者和上一张牌的颜色相同

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())

 题目描述

有这么一款单人卡牌游戏,牌面由颜色和数字组成,颜色为红、黄、蓝、绿中的一种,数字为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

题目解析

本题连续出牌的条件是:

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

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

  • 和上一张牌的数字相同,或者和上一张牌的颜色相同

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())

 题目描述

有这么一款单人卡牌游戏,牌面由颜色和数字组成,颜色为红、黄、蓝、绿中的一种,数字为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

题目解析

本题连续出牌的条件是:

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

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

  • 和上一张牌的数字相同,或者和上一张牌的颜色相同

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())

标签:200,used,打出,Python,OD,手牌,num,ans,cards
From: https://blog.csdn.net/qq_30247949/article/details/140349642

相关文章

  • Python基础语法以及在PyCharm中的用法
    目录输入和输出变量注释基本数据类型整型int浮点float字符串str布尔值bool输入和输出用print()在括号中加上字符串,就可以向屏幕上输出指定的文字。比如输出'hello,world',用代码实现如下:print('hello,world')print()函数也可以接受多个字符串,用逗号“,”隔开,就......
  • Python爬虫实战案例,从入门到进阶,零基础教程!
    这篇文章我们介绍了一下Python中的正则表达式和与爬虫正则相关的re模块,本章我们就利用正则表达式和re模块来做一个案例,爬取《糗事百科》的糗事并存储到本地。我们要爬取的网站链接是 https://www.qiushibaike.com/text/page/1/ 。我们要爬取的是里面的糗事,在之前......
  • python杀毒引擎
    importosimporthashlibmalware_signatures_md5={  "eicar_test_file":"44d88612fea8a8f36de82e1278abb02f",   "eicar_test_file":'eda588c0ee78b585f645aa42eff1e57a' ,  "eicar_test_file":'19db......
  • Python期末考试知识点(史上最全)
     python简介type()不会认为子类是一种父类类型。isinstance()会认为子类是一种父类类型基础语法运算符:算术运算符:多了一个**,代表幂方5**5就是5的5次方还多了一个//整数除法逻辑运算符:and,or,not与,或,非赋值运算符:没有++,–身份运算符:......
  • Python爬虫入门详细教程,通俗易懂,看一遍就会!(含实例)
    一、正确认识Python爬虫爬虫是门很有意思的技术,可以通过爬虫技术获取一些别人拿不到或者需要付费才能拿到的东西,也可以对大量数据进行自动爬取和保存,减少时间和精力去手动做一些累活。【爬虫资料领取方式在文末!!】可以说很多人学编程,不玩点爬虫确实少了很多意思,不管是业余......
  • 1.Introduction to Spring Web MVC framework
    WebMVCframework文档:22.WebMVCframework(spring.io)概述WebMVC框架(WebModel-View-ControllerFramework)是一种用于构建Web应用程序的软件架构模式。MVC模式将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这种分离有助于组织代码和简化开发......
  • T5架构和主流llama3架构有什么区别和优缺点、transformer中encoder 和decoder的不同、
    T5架构和主流llama3架构有什么区别和优缺点T5和LLaMA是两种在自然语言处理(NLP)领域广泛应用的大型语言模型,它们在架构和应用上有显著的区别和各自的优缺点。T5架构架构特点:Encoder-Decoder结构:T5(Text-to-TextTransferTransformer)采用了经典的Encoder-DecoderTransform......
  • Python 神器:wxauto 库——解锁微信自动化的无限可能
    ......
  • 【python零基础入门到就业】009、Python中的数据类型(超详细)
    文章目录前言1.基本数据类型1.1整数(int)1.2浮点数(float)1.3字符串(str)1.4布尔值(bool)1.5基本数据类型示意图2.复合数据类型2.1列表(list)2.2元组(tuple)2.3字典(dict)2.4集合(set)2.5复合数据类型示意图3.type()语句的使用方法3.1基本用法3.2动态类型检查3.3与`isi......
  • 8 个 Python 实用脚本,赶紧收藏备用!
    脚本写的好,下班下得早!程序员的日常工作除了编写程序代码,还不可避免地需要处理相关的测试和验证工作。例如,访问某个网站一直不通,需要确定此地址是否可访问,服务器返回什么,进而确定问题在于什么。完成这个任务,如果一味希望采用编译型语言来编写这样的代码,实践中的时间和精力是不......