【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="")



相关文章
|
2月前
|
IDE 开发工具 Python
Python扑克游戏编程---摸大点
Python扑克游戏编程---摸大点
60 1
|
3月前
|
Python
python编写下象棋游戏|4-14
python编写下象棋游戏|4-14
|
3月前
|
人工智能 算法 图形学
总有一个是你想要的分享40个Python游戏源代码
这是一系列基于Python开发的游戏项目集合,包括中国象棋、麻将、足球、坦克大战、扑克等多种类型游戏,运用了Pygame等库实现图形界面与AI算法。此外还包含迷宫、数独、推箱子等益智游戏及经典游戏如《仙剑奇侠传二战棋版》和《星露谷物语》的Python版本,适合编程学习与娱乐。
132 11
|
2月前
|
数据采集 前端开发 Python
Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
79 0
|
3月前
|
消息中间件 数据采集 数据库
庆祝吧!Python IPC让进程间的合作,比团队游戏还默契
【9月更文挑战第7天】在这个数字化时代,软件系统日益复杂,单进程已难以高效处理海量数据。Python IPC(进程间通信)技术应运而生,使多进程协作如同训练有素的电竞战队般默契。通过`multiprocessing`模块中的Pipe等功能,进程间可以直接传递数据,无需依赖低效的文件共享或数据库读写。此外,Python IPC还提供了消息队列、共享内存和套接字等多种机制,适用于不同场景,使进程间的合作更加高效、精准。这一技术革新让开发者能轻松应对复杂挑战,构建更健壮的软件系统。
43 1
|
4月前
|
机器学习/深度学习 存储 定位技术
强化学习Agent系列(一)——PyGame游戏编程,Python 贪吃蛇制作实战教学
本文是关于使用Pygame库开发Python贪吃蛇游戏的实战教学,介绍了Pygame的基本使用、窗口初始化、事件处理、键盘控制移动、以及实现游戏逻辑和对象交互的方法。
|
5月前
|
机器学习/深度学习 人工智能 开发者
Python适合做游戏吗?
【7月更文挑战第2天】Python适合做游戏吗?
114 56
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】python之人工智能应用篇--游戏生成技术
游戏生成技术,特别是生成式人工智能(Generative Artificial Intelligence, 简称Generative AI),正逐步革新游戏开发的多个层面,从内容创作到体验设计。这些技术主要利用机器学习、深度学习以及程序化内容生成(Procedural Content Generation, PCG)来自动创造游戏内的各种元素,显著提高了开发效率、丰富了游戏内容并增强了玩家体验。以下是生成式AI在游戏开发中的几个关键应用场景概述
84 2
|
4月前
|
Python
【python】Python成语接龙游戏[1-3难度均有](源码+数据)【独一无二】
【python】Python成语接龙游戏[1-3难度均有](源码+数据)【独一无二】
|
4月前
|
Python
【Leetcode刷题Python】174. 地下城游戏
LeetCode 174题 "地下城游戏" 的Python解决方案,使用动态规划算法计算骑士从左上角到右下角拯救公主所需的最低初始健康点数。
55 3