当前位置: 首页 > article >正文

备战菊厂笔试2-BFS记忆化MLE?用Set去重-Set会TLE?用SortedSet剪枝

目录

200.岛屿数量

不用getnei,直接在dfs判断,去掉解包

如果害怕栈溢出那么可以用bfs

2617.网格图中最少访问的格子数 

注意特判!

MLE主要是因为vis占用的内存过大

用SortedSet有序剪枝

什么是SortedSet?

基本性质

导入

常用操作

初始化

添加与删除

索引(因为有序的所以支持bisect,类似于list)

范围查询 irange( , ) !!!

我们可以用 list + bisect 实现类似SortedSet

本题题解

官方题解

单调栈优化DP

线段树

1702.修改后的最大二进制字符串


200.岛屿数量

很明显的DFS连通性判断 

遍历地图找1,然后开始传染(如果不想修改原本数据集可以用vis存储已访问数据)

class Solution:def numIslands(self, grid):lx=len(grid)ly=len(grid[0])d=[(0,1),(0,-1),(1,0),(-1,0)]def get_nei(x,y):neis=[]for dx,dy in d:nx,ny=x+dx,y+dyif 0<=nx<lx and 0<=ny<ly:neis.append((nx,ny))#tuple方便解包return neisdef dfs(x,y):if grid[x][y]=='1':grid[x][y]='0'for nx,ny in get_nei(x,y):dfs(nx,ny)#传染0ans=0for i in range(lx):for j in range(ly):if grid[i][j]=='1':dfs(i,j)ans+=1return ansif __name__=='__main__':grid = [["1","1","0","0","0"],["1","1","0","0","0"],["0","0","1","0","0"],["0","0","0","1","1"]]sol=Solution()#创建对象ans=sol.numIslands(grid)print(ans)

但是这样只击败35%的解法

不用getnei,直接在dfs判断,去掉解包

去掉getnei,去掉解包(解包的在数据很多时会影响时间复杂度)

def numIslands(self, grid):if not grid:return 0rows, cols = len(grid), len(grid[0])count = 0def dfs(r, c):# 边界条件或已访问过(水域)if r < 0 or c < 0 or r >= rows or c >= cols or grid[r][c] == '0':return# 标记为已访问grid[r][c] = '0'# 直接检查四个方向dfs(r+1, c)dfs(r-1, c)dfs(r, c+1)dfs(r, c-1)for i in range(rows):for j in range(cols):if grid[i][j] == '1':count += 1dfs(i, j)return count

如果害怕栈溢出那么可以用bfs

from collections import dequedef numIslands(self, grid):if not grid:return 0rows, cols = len(grid), len(grid[0])count = 0for i in range(rows):for j in range(cols):if grid[i][j] == '1':count += 1grid[i][j] = '0'  # 标记为已访问# BFSqueue = deque([(i, j)])while queue:r, c = queue.popleft()directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]for dr, dc in directions:nr, nc = r + dr, c + dcif 0 <= nr < rows and 0 <= nc < cols and grid[nr][nc] == '1':queue.append((nr, nc))grid[nr][nc] = '0'  # 标记为已访问return count

2617.网格图中最少访问的格子数 

2617. 网格图中最少访问的格子数

分析题目,对于x,y点可以向右或者向下,其行动能力为该节点的权值 

我刚开始还想着用DFS表示着来做,但是这复杂度也太高了!

得利用BFS逐层拓展的性质,第一次碰到就是最短

得vis记忆化:之前层走的肯定是先到的

from collections import dequeclass Solution:def minimumVisitedCells(self, grid):if grid == [[0]]:return 1lx = len(grid)ly = len(grid[0])visited = [[False] * ly for _ in range(lx)]queue = deque()queue.append((0, 0, 1))  # (x, y, 当前步数)while queue:x, y, step = queue.popleft()if visited[x][y]:continuevisited[x][y] = True# 尝试向下跳for i in range(1, grid[x][y] + 1):nx = x + iif nx >= lx:breakif not visited[nx][y]:if nx == lx - 1 and y == ly - 1:return step + 1queue.append((nx, y, step + 1))# 尝试向右跳for i in range(1, grid[x][y] + 1):ny = y + iif ny >= ly:breakif not visited[x][ny]:if x == lx - 1 and ny == ly - 1:return step + 1queue.append((x, ny, step + 1))return -1

注意:得在类外面导入库!

注意特判!

起点就是终点的时候不是输出-1,而是输出1

        if grid==[[0]]:return 1

结果后面MLE了

(这道题不用dijkstra,因为每步代价是一样的)

MLE主要是因为vis占用的内存过大

用set去重

用两个二维数组,一个存储每一行未被访问的列,另一个存储每一列未被访问的行

那么就从原来的加入到 vis 变成从 set remove

from collections import dequeclass Solution:def minimumVisitedCells(self, grid):if grid == [[0]]:return 1lx = len(grid)ly = len(grid[0])#每一行未被访问的列lie=[set(range(ly)) for i in range(lx)]hang=[set(range(lx)) for i in range(ly)]#每一列未被访问的行lie[0].remove(0)hang[0].remove(0)queue=deque()queue.append((0,0,1))while queue:x,y,step=queue.popleft()for i in range(1,grid[x][y]+1):nx=x+iif nx>=lx:breakif nx in hang[y]:if nx==lx-1 and y==ly-1:return step+1queue.append((nx,y,step+1))hang[y].remove(nx)for i in range(1,grid[x][y]+1):ny=y+iif ny>=ly:breakif ny in lie[x]:if x==lx-1 and ny==ly-1:return step+1queue.append((x,ny,step+1))lie[x].remove(ny)return -1

但是这样TLE了

用SortedSet有序剪枝

什么是SortedSet?

和set类似,但会保持元素始终按顺序排列,支持范围查询和有序操作,非常适合搜索剪枝优化、模拟平衡树等

基本性质

和set一样不允许重复元素

元素自动排序(默认升序)

支持快速:

        插入和删除

        查找、区间查询、二分查找

导入

从 sortedcontainers 排序容器导入

from sortedcontainers import SortedSet  # 第三方库,需pip安装
常用操作
初始化
ss=SortedSet([1,9,2,8])ss=SortedSet(列表名)
添加与删除
s.add( 元素值 )s.discard( 元素值 )
索引(因为有序的所以支持bisect,类似于list)
print(s[0])     # 输出最小值(1)
print(s[-1])    # 输出最大值(9)
print(s.bisect_left(5))  # 2,表示第一个 ≥5 的位置
print(s.bisect_right(5)) # 3,表示第一个 >5 的位置
范围查询 irange( , ) !!!
# 获取大于等于 2 且小于等于 7 的所有元素(闭区间)
print(list(s.irange(2, 7)))  # [5, 7]
# 获取大于 3 的元素(开区间)
print(list(s.irange(3, 9, inclusive=(False, True)))  # [5, 7, 9]

所以这题里面我们可以用 irange快速找到可以跳远的位置

我们可以用 list + bisect 实现类似SortedSet

就是要注意列表的查重

本题题解

from collections import deque
from bisect import bisect_right
from sortedcontainers import SortedSet  # 第三方库,需安装class Solution:def minimumVisitedCells(self, grid):if grid == [[0]]:return 1m, n = len(grid), len(grid[0])row = [SortedSet(range(n)) for _ in range(m)]col = [SortedSet(range(m)) for _ in range(n)]queue = deque([(0, 0, 1)])row[0].discard(0)col[0].discard(0)while queue:x, y, step = queue.popleft()max_jump = grid[x][y]# 向右推进candidates = list(row[x].irange(y + 1, y + max_jump))for ny in candidates:if x == m - 1 and ny == n - 1:return step + 1queue.append((x, ny, step + 1))row[x].discard(ny)# 向下推进candidates = list(col[y].irange(x + 1, x + max_jump))for nx in candidates:if nx == m - 1 and y == n - 1:return step + 1queue.append((nx, y, step + 1))col[y].discard(nx)return -1

官方题解

和Dijkstra一样都贪心先处理小的-最小堆

class Solution:def minimumVisitedCells(self, grid: List[List[int]]) -> int:m, n = len(grid), len(grid[0])dist = [[-1] * n for _ in range(m)]dist[0][0] = 1row, col = [[] for _ in range(m)], [[] for _ in range(n)]def update(x: int, y: int) -> int:return y if x == -1 or y < x else xfor i in range(m):for j in range(n):while row[i] and row[i][0][1] + grid[i][row[i][0][1]] < j:heapq.heappop(row[i])if row[i]:dist[i][j] = update(dist[i][j], dist[i][row[i][0][1]] + 1)while col[j] and col[j][0][1] + grid[col[j][0][1]][j] < i:heapq.heappop(col[j])if col[j]:dist[i][j] = update(dist[i][j], dist[col[j][0][1]][j] + 1)if dist[i][j] != -1:heapq.heappush(row[i], (dist[i][j], j))heapq.heappush(col[j], (dist[i][j], i))return dist[m - 1][n - 1]

单调栈优化DP

class Solution:def minimumVisitedCells(self, grid: List[List[int]]) -> int:m, n = len(grid), len(grid[0])col_stacks = [[] for _ in range(n)]  # 每列的单调栈for i in range(m - 1, -1, -1):row_st = []  # 当前行的单调栈for j in range(n - 1, -1, -1):g = grid[i][j]col_st = col_stacks[j]mn = inf if i < m - 1 or j < n - 1 else 1if g:  # 可以向右/向下跳# 在单调栈上二分查找最优转移来源k = bisect_left(row_st, -(j + g), key=lambda p: p[1])if k < len(row_st):mn = row_st[k][0] + 1k = bisect_left(col_st, -(i + g), key=lambda p: p[1])if k < len(col_st):mn = min(mn, col_st[k][0] + 1)if mn < inf:# 插入单调栈while row_st and mn <= row_st[-1][0]:row_st.pop()row_st.append((mn, -j))  # 保证下标单调递增,方便调用 bisect_leftwhile col_st and mn <= col_st[-1][0]:col_st.pop()col_st.append((mn, -i))  # 保证下标单调递增,方便调用 bisect_leftreturn mn if mn < inf else -1  # 最后一个算出的 mn 就是 f[0][0]

线段树

区间查询+单点更新

import sys
sys.setrecursionlimit(1 << 25)INF = float('inf')class SegmentTree:def __init__(self, size):self.N = sizeself.tree = [INF] * (4 * size)def update(self, o, l, r, idx, val):if l == r:self.tree[o] = valreturnm = (l + r) // 2if idx <= m:self.update(o * 2, l, m, idx, val)else:self.update(o * 2 + 1, m + 1, r, idx, val)self.tree[o] = min(self.tree[o * 2], self.tree[o * 2 + 1])def query(self, o, l, r, L, R):if L > R:return INFif L <= l and r <= R:return self.tree[o]m = (l + r) // 2res = INFif L <= m:res = min(res, self.query(o * 2, l, m, L, R))if R > m:res = min(res, self.query(o * 2 + 1, m + 1, r, L, R))return resclass Solution:def minimumVisitedCells(self, grid):m, n = len(grid), len(grid[0])minl = [SegmentTree(m) for _ in range(n)]  # 每一列的线段树ans = INFfor i in reversed(range(m)):minh = SegmentTree(n)  # 当前行的线段树for j in reversed(range(n)):mn = INFg = grid[i][j]if i == m - 1 and j == n - 1:mn = 1if j + 1 <= min(j + g, n - 1):mn = min(mn, minh.query(1, 1, n, j + 2, min(j + g + 1, n)) + 1)if i + 1 <= min(i + g, m - 1):mn = min(mn, minl[j].query(1, 1, m, i + 2, min(i + g + 1, m)) + 1)if mn < INF:minh.update(1, 1, n, j + 1, mn)minl[j].update(1, 1, m, i + 1, mn)if i == 0 and j == 0:ans = mnreturn -1 if ans == INF else ans

1702.修改后的最大二进制字符串

1702. 修改后的最大二进制字符串

猜了一波然后错了 

        '''猜错了!l=len(binary)if binary=='01':return '01'if int(binary)==0:s='1'*(l-1)+'0'return sif sum(map(int,list(binary)))==l:return binaryx=int(l/2)s='1'*x+'0'+'1'*(l-x-1)return s'''

然后我开始观察这两个操作对二进制串的影响

操作1.将00转为10,可以变大

操作2.将10转为01,这会变小啊?

所以操作2存在的意义就是为了操作1 :将0往前推,从而产生操作1的条件

于是自以为是的我就直接把0全往开头放然后进行操作1

        '''c0=binary.count('0')#特判!!????if c0==1:return binaryif c0==0:return binaryc1=binary.count('1')s='1'*(c0-1)+'0'+'1'*c1return s'''

但是有没有一种可能原本前面1呆的好好的被你往后推了?

比如111000变成000111变成

        110111,明显变小了因为第三位的变化,所以这是明显不可取的

我们得从第一个0开始变

class Solution:def maximumBinaryString(self, binary: str) -> str:l=len(binary)c0=bianry.count('0')c1=binary.count('1')if c0==0:return binaryfor i in range(l):#找第一个0if binary[i]=='0':x=ibreakc12=c1-xs=x*'1'+'1'*(c0-1)+'0'+'1'*c12return s

相关文章:

备战菊厂笔试2-BFS记忆化MLE?用Set去重-Set会TLE?用SortedSet剪枝

目录 200.岛屿数量 不用getnei&#xff0c;直接在dfs判断&#xff0c;去掉解包 如果害怕栈溢出那么可以用bfs 2617.网格图中最少访问的格子数 注意特判&#xff01; MLE主要是因为vis占用的内存过大 用SortedSet有序剪枝 什么是SortedSet&#xff1f; 基本性质 导入 …...

主机A向主机B发送一个长度为L字节的文件,假设TCP的MSS为1460字节,则在TCP的序号不重复使用的前提下,L的最大值是多少?

&#x1f4d8;题干回顾&#xff1a; 主机A向主机B发送一个长度为L字节的文件&#xff0c;假设TCP的MSS为1460字节&#xff0c;则在TCP的序号不重复使用的前提下&#xff0c;L的最大值是多少&#xff1f; 这个问题关键在于“TCP序号不重复使用”。 ✅ 正确答案是&#xff1a;D.…...

【RabbitMQ】发布确认机制的具体实现

文章目录 模式介绍建立连接单独确认代码实现逻辑运行结果 批量确认代码实现逻辑运行结果 异步确认实现逻辑介绍代码实现逻辑运行结果 三种策略对比以及完整代码 模式介绍 作为消息中间件&#xff0c;都会面临消息丢失的问题&#xff0c;消息丢失大概分为三种情况&#xff1a; …...

React状态管理-对state进行保留和重置

相同位置的相同组件会使得 state 被保留下来 当你勾选或清空复选框的时候&#xff0c;计数器 state 并没有被重置。不管 isFancy 是 true 还是 false&#xff0c;根组件 App 返回的 div 的第一个子组件都是 <Counter />&#xff1a; 你可能以为当你勾选复选框的时候 st…...

vue和springboot交互数据,使用axios【跨域问题】

vue和springboot交互数据&#xff0c;使用axios【跨域问题】 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&…...

AJAX 使用 和 HTTP

ajax学习 promise和 awit Node.js 和 webpack 前端工程化 Git工具 AJAX异步的JS和XML&#xff1a; 使用XML对象和服务器通信 在这里插入图片描述 统一资源定位符 URL HTTP 超文本传输协议 域名 资源路径 资源目录和类型 URL 查询参数 使用&#xff1f;表示之后的参数…...

MySQL之基础事务

目录 引言&#xff1a; 什么是事务&#xff1f; 事务和锁 mysql数据库控制台事务的几个重要操作指令&#xff08;transaction.sql&#xff09; 1、事物操作示意图&#xff1a; 2.事务的隔离级别 四种隔离级别&#xff1a; 总结一下隔离指令 1. 查看当前隔离级别​​ …...

uniapp设置 overflow:auto;右边不显示滚动条的问题

设置了overflow&#xff1a;auto;或者其它overflow的属性不显示滚动条是因为在uniapp中默认隐藏了滚动条 解决方法&#xff1a; //强制显示滚动条 ::-webkit-scrollbar {width: 8px !important;background: #ccc !important;display: block !important;}//设置滚动条颜色.cu-…...

数据库基础复习笔记

数据库 相关概念 名称全称检查数据库存储数据的仓库&#xff0c;数据是有组织的进行存储DataBase&#xff08;DB&#xff09;数据库管理系统操作和管理数据库的大型软件DataBase Management System(DBMS)SQL操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库…...

MySQL基础关键_013_常用 DBA 命令

目 录 一、MySQL 用户信息存储位置 二、新建用户 1.创建本地用户 2.创建外网用户 三、用户授权 1.说明 2.实例 四、撤销授权 五、修改用户密码 六、修改用户名、主机名/IP地址 七、删除用户 八、数据备份 1.导出数据 2.导入数据 &#xff08;1&#xff09;方式…...

爬虫请求频率应控制在多少合适?

爬虫请求频率的控制是一个非常重要的问题&#xff0c;它不仅关系到爬虫的效率&#xff0c;还涉及到对目标网站服务器的影响以及避免被封禁的风险。合理的请求频率需要根据多个因素来综合考虑&#xff0c;以下是一些具体的指导原则和建议&#xff1a; 一、目标网站的政策 查看网…...

探秘网络邮差:FTP、Telnet、SMTP、NFS、SNMP介绍

引言&#xff1a;谁是网络世界的“邮差”&#xff1f; 想象一下&#xff0c;你正在网上冲浪——发送一封邮件、上传一份文件、远程登录服务器&#xff0c;甚至只是打开一个网页。这些看似简单的操作背后&#xff0c;其实有一群默默无闻的“邮差”在辛勤工作。它们就是应用层协…...

java基础:异常体系

目录 一、java异常体系介绍二、异常1、运行时异常2、非运行时异常 三、错误四、异常的处理方式1、方式1&#xff1a;throws声明抛出异常1.1、throws关键字1.2、throw关键字 2、方式2&#xff1a;try-catch-finally 一、java异常体系介绍 异常体系图如下&#xff1a; Throwable…...

CSS Grid布局:从入门到实战

CSS Grid布局&#xff1a;从入门到实战 一、初识Grid布局 还在为网页布局发愁吗&#xff1f;Flexbox虽然好用&#xff0c;但当遇到复杂布局时&#xff0c;CSS Grid才是真正的王者。Grid布局是CSS中最强大的二维布局系统&#xff0c;它就像一张无形的网格纸&#xff0c;让我们…...

记录算法笔记(20025.5.14)对称二叉树

给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 提示&#xff1a; 树中节点数目…...

QT Creator配置Kit

0、背景&#xff1a;qt5.12.12vs2022 记得先增加vs2017编译器 一、症状&#xff1a; 你是否有以下症状&#xff1f; 1、用qt新建的工程&#xff0c;用qmake&#xff0c;可惜能看见的只有一个pro文件&#xff1f; 2、安装QT Creator后&#xff0c;使用MSVC编译显示no c com…...

JVM 与云原生的完美融合:引领技术潮流

最近佳作推荐&#xff1a; Java 大厂面试题 – 揭秘 JVM 底层原理&#xff1a;那些令人疯狂的技术真相&#xff08;New&#xff09; Java 大厂面试题 – JVM 性能优化终极指南&#xff1a;从入门到精通的技术盛宴&#xff08;New&#xff09; Java 大厂面试题 – JVM 深度剖析&…...

Ubuntu24.04编译ORB_SLAM的一系列报错解决

Ubuntu24.04编译ORB_SLAM的一系列报错解决 decay_t报错 报错信息&#xff1a;error: ‘decay_t’ is not a member of ‘std’&#xff1b;did you mean ‘decay’ 将CMakeLists.txt中第17行的c标准修改为c14即可&#xff1a; 修改前&#xff1a; CHECK_CXX_COMPILER_FLAG…...

为何大模型都使用decoder-only?

第一章 架构之争的历史脉络 1.1 从双向到单向的革命 2017年&#xff0c;BERT的横空出世让双向注意力机制成为NLP领域的“武林盟主”。通过Masked Language Modeling&#xff08;MLM&#xff09;&#xff0c;BERT在阅读理解、情感分析等任务中展现出惊人的表现&#xff0c;但它…...

《Effective Python》第2章 字符串和切片操作——Python 字符串格式化的现代选择f-strings

引言 本篇博客基于学习《Effective Python》第三版 Chapter 2: Strings and Slicing 的 Item 11 “Prefer Interpolated F-Strings Over C-style Format Strings and str.format” 的总结与延伸。 字符串格式化是 Python 编程中的常见操作&#xff0c;用于动态生成可读性高的…...

企业报表平台如何实现降本增效

一、你的企业是否正被这些问题拖累&#xff1f;‌ 财务还在手动汇总各门店的Excel销售数据&#xff1b;市场部总抱怨“客户分析全靠拍脑袋”&#xff1b;仓库突然发现爆款断货&#xff0c;但上周的报表显示库存充足…… 这些场景你是否熟悉&#xff1f;数据散落在ERP、E…...

Ollama+OpenWebUI+docker完整版部署,附带软件下载链接,配置+中文汉化+docker源,适合内网部署,可以局域网使用

前言&#xff1a; 因为想到有些环境可能没法使用外网的大模型&#xff0c;所以可能需要内网部署&#xff0c;看了一下ollama适合小型的部署&#xff0c;所以就尝试了一下&#xff0c;觉得docker稍微简单一点&#xff0c;就做这个教程的&#xff0c;本文中重要的内容都会给下载…...

git push 报错:send-pack: unexpected disconnect while reading sideband packet

背景 新建了一个仓库&#xff0c;第一次push 代码文件&#xff0c;文件中有一个依赖的jar&#xff0c;有80MB&#xff0c;结果push的时候报错。 错误信息 error: RPC failed; HTTP 500 curl 22 The requested URL returned error: 500 send-pack: unexpected disconnect whi…...

考研英一真题学习笔记 2018年

2018 年全国硕士研究生招生考试 英语 &#xff08;科目代码&#xff1a;201&#xff09; Section Ⅰ Use of English Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on the ANSWER SHEET. (10 points) Trust i…...

ultralytics中tasks.py---parse_model函数解析

一、根据scale获取对应的深度、宽度和最大通道数 具体例如yaml文件内容如下: depth=0.33,那么重复的模块例如C2f原本重复次数是3,6,6,3,那么T对应的模型重复次数就是三分之一即1,1,2,1次。这个在后面定义的: width=0.25,max_channels=1024 原本c2=64,但经过make_div…...

Java知识框架

一、Java 基础语法 1. 基础语法 数据类型 基本类型&#xff1a;int, double, boolean, char 等 引用类型&#xff1a;String, 数组, 对象 变量与常量 final 关键字 作用域&#xff08;局部变量、成员变量&#xff09; 运算符 算术、逻辑、位运算 三元运算符 ? : 控制…...

2024年业绩增速大幅回退,泸州老窖未能“重回前三”

撰稿|行星 来源|贝多财经 回望过去的2024年&#xff0c;受制于购买力与消费需求的持续疲软&#xff0c;白酒行业的发展面临诸多复杂性与不确定性&#xff0c;“量价齐跌”犹如笼罩在各大企业头顶的一片阴云。 正如巴菲特所言&#xff1a;“当潮水退去时&#xff0c;才知道谁在…...

院校机试刷题第二天:1479 01字符串、1701非素数个数

一、1479 01字符串 1.题目描述 2.解题思路 方法一&#xff1a;暴力法 模拟过程&#xff0c;列出几个数据来a[1]1, a[2]2, a[3]3, a[4]5以此类推&#xff0c;这就是斐波那契数列&#xff0c;每一项都等于前两项之和&#xff0c;确定好a[1], a[2]即可。 方法二&#xff1a;动…...

【Vue.js 的核心魅力:深入理解声明式渲染】

Vue.js 的核心魅力&#xff1a;深入理解声明式渲染 在现代前端框架的浪潮中&#xff0c;Vue.js 以其轻量、易学、高效的特点赢得了广大开发者的青睐。其核心魅力之一&#xff0c;便是其优雅的**声明式渲染 (Declarative Rendering)**机制。理解声明式渲染不仅能帮助我们更好地…...

制作一款打飞机游戏48:敌人转向

射击功能 有一个重要的功能我们还没实现&#xff0c;那就是射击。目前&#xff0c;敌人还不能射击&#xff0c;这显然是不行的。因此&#xff0c;我们决定添加一个射击命令&#xff0c;暂时用一个显示圆圈的方式来表示射击动作。 编程语言的调试 有趣的是&#xff0c;我们创…...