【Python 百练成钢】卡片游戏、铁轨问题、移动小球

简介: 【Python 百练成钢】卡片游戏、铁轨问题、移动小球

前言


两日不见,超级想念🤡。由于在学校比较忙停更了两天,但是算法题还是在继续写的🤥。今天分享一下在与队列栈相关的算法题。在Python中是没有内置的栈结构的,不像C++中的STL容器,但是我们可以自己实现一个栈。对于队列的话Python内置的collections中有成熟的双端队列,使用起来超级方便。

🗨卡片游戏:使用到的知识与队列有关,直接进行模拟即可

🗨铁轨问题:使用的知识是有关栈的知识。

🗨移动小球:题目的原意考验我们对链表的掌握情况,但是在Python中可以使用相关的语言特点轻松完成。

栈与队列数据结构今天咱就不在这细说拉,直接开始如何使用Python实现栈,如何使用Python的双端队列。


1.卡片游戏🏄‍♂️



问题描述🪐


桌上有一叠牌,从第一张牌(即位于顶面的牌)开始从上往下依次编号为1~n。当至

少还剩两张牌时进行以下操作:把第一张牌扔掉, 然后把新的第一张放到整叠牌的最后。

输入n,输出每次扔掉的牌,以及最后剩下的牌。

样例输入: 7

样例输出: 1 3 5 7 4 2 6


问题分析🪐


题目比较简单,不用思考直接对题目进行模拟就可以。

这里使用的是collections模块的deque包

在这个下面是一个双端队列,可以很轻松的从两端删除、添加数据。


代码实现🪐


老规矩先上运行结果:

9c7c6e850b564d298d823f366a11ffaa.png

from collections import deque
dq=deque()
n=int(input())
for i in range(1,n+1):
    dq.appendleft(i)
while len(dq)>=2:
    print(dq.pop(),end=" ")
    dq.appendleft(dq.pop())
print(dq.pop(),end="")


2.铁轨问题🏊‍♂️



问题描述🪐


某城市有一火车站,铁轨铺设如图所示。有n节车厢从A方向驶入车站,按进

站顺序编号为1~n。你的任务是让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。

为了重组车厢,你可以借助中转站C。这是一个可以停放任意多节车厢的车站,但由于末端

封顶,驶入C的车厢必须按照相反的顺序驶出C。对于每个车厢,旦从A移入C, 就不

能再回到A了;一旦从C移入B,就不能回到C了。换句话说,在任意时刻,只有两种选

择: A→C和C→B。


3d41b3700dcb498e99de3b4039c5fddc.png


样例输入:

5

1 2 3 4 5

5

5 4 1 2 3

6

6 5 4 3 2 1

样例输出:

Yes

No

Yes


问题分析🪐


铁轨问题就是如果进行暴力解决的话会很复杂,因为你不知道有几种情况组合

好在题目给出了样例输出,也就是说咱们可以将输入的数据与栈内的数据最终结果进行匹配

如果等原始队列中的数据抽完了,并且栈内的元素没有与最终结果相匹配的

就进行输出No,否则原始队列与栈都为空的时候匹配成功输出Yes

这个题目自己实现一个栈并不是必须的,也可以使用列表进行判空判栈顶元素。


代码实现🪐


老规矩先上运行结果:

a103c79124a5460b85adccd0d5fc5dd1.png


class Stack(object):
    """栈"""
    def __init__(self):
         self.items = []
    def is_empty(self):
        """判断是否为空"""
        return self.items == []
    def push(self, item):
        """加入元素"""
        self.items.append(item)
    def pop(self):
        """弹出元素"""
        return self.items.pop()
    def top(self):
        """返回栈顶元素"""
        return self.items[len(self.items)-1]
    def size(self):
        """返回栈的大小"""
        return len(self.items)
if __name__ == "__main__":
    s= Stack()
    n=int(input())
    # 输入的最终序列
    num=sys.stdin.readline().strip().split()
    num=[int(x) for x in num]
    # 生成原始序列
    ansnum=[i for i in range(1,n+1)]
    # print(num)
    # print(ansnum)
    # 记录初始跟后续队列位置
    i1=0
    i2=0
    flag=True
    while i2<n:        
        if not s.is_empty() and s.top()==num[i2]:
            s.pop()
            i2+=1
        elif i1<n and ansnum[i1]==num[i2]:
            i1+=1
            i2+=1
        elif i1<n:
            s.push(ansnum[i1])
            i1+=1 
        else:
            flag=False
            break
    # print(s)
    # print(i1,n,len(s))
    if flag:
        print("Yes")
    else:
        print("No")       


3.移动小球🏋️‍♂️



问题描述🪐


你可以执行两种指令。其中,A X Y表示把小球x移动到小球Y左边,

B X Y表示把小球X移动到小球Y右边。指令保证合法,即X不等于Y。

输入小球个数n,指令条数m和m条指令,从左到右输出最后的序列。注意,n可能

高达500000,而m可能高达100000。

样例输入:

6 2

A 1 4

B 3 5

样例输出:

214536


问题分析🪐


对于本问题直接进行模拟即可,使用C++或者C语言可能创建一个链表可以更加轻松地完成任务

对于Python而言合理的使用列表的方法可能会事半功倍。


代码实现🪐


老规矩先上运行结果:


8eb384fb695e4d1185c28a918dd0b2f4.png

import sys
m,n=sys.stdin.readline().strip().split()
m,n=int(m),int(n)
ls=[]
for i in range(1,m+1):
    ls.append(i)
for i in range(n):
    q,w,e=sys.stdin.readline().strip().split()
    w=int(w)
    e=int(e)
    # print(w,e)
    if q=='A':
        ls.remove(w)
        ls.insert(ls.index(e),w)
    else:
        ls.remove(w)
        ls.insert(ls.index(e)+1,w)
# print(ls)
for i in ls:
    print(i,end="")



相关文章
|
12月前
|
存储 人工智能 运维
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
632 48
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
|
4月前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
12月前
|
人工智能 Python
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
479 7
|
6月前
|
存储 算法 区块链
从零实现Python扫雷游戏:完整开发指南与深度解析
扫雷作为Windows经典游戏,承载了许多人的童年回忆。本文将详细介绍如何使用Python和Tkinter库从零开始构建一个功能完整的扫雷游戏,涵盖游戏设计、算法实现和界面开发的全过程。
508 1
|
7月前
|
人工智能 搜索推荐 数据可视化
用 Python 制作简单小游戏教程:手把手教你开发猜数字游戏
本教程详细讲解了用Python实现经典猜数字游戏的完整流程,涵盖从基础规则到高级功能的全方位开发。内容包括游戏逻辑设计、输入验证与错误处理、猜测次数统计、难度选择、彩色输出等核心功能,并提供完整代码示例。同时,介绍了开发环境搭建及调试方法,帮助初学者快速上手。最后还提出了图形界面、网络对战、成就系统等扩展方向,鼓励读者自主创新,打造个性化游戏版本。适合Python入门者实践与进阶学习。
874 1
|
7月前
|
存储 算法 数据可视化
用Python开发猜数字游戏:从零开始的手把手教程
猜数字游戏是编程入门经典项目,涵盖变量、循环、条件判断等核心概念。玩家通过输入猜测电脑生成的随机数,程序给出提示直至猜中。项目从基础实现到功能扩展,逐步提升难度,适合各阶段Python学习者。
541 0
|
12月前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
589 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
302 33
|
IDE 开发工具 Python
Python扑克游戏编程---摸大点
Python扑克游戏编程---摸大点
214 1

推荐镜像

更多