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

1.五子棋对弈python解法——2024年省赛蓝桥杯真题

问题描述

原题传送门:1.五子棋对弈 - 蓝桥云课

"在五子棋的对弈中,友谊的小船说翻就翻?" 不!对小蓝和小桥来说,五子棋不仅是棋盘上的较量,更是心与心之间的沟通。这两位挚友秉承着"友谊第一,比赛第二"的宗旨,决定在一块 5×5 的棋盘上,用黑白两色的棋子来决出胜负。但他们又都不忍心让对方失落,于是决定用一场和棋(平局)作为彼此友谊的见证。

比赛遵循以下规则:

棋盘规模:比赛在一个 5×5 的方格棋盘上进行,共有 25 个格子供下棋使用

棋子类型:两种棋子,黑棋与白棋,代表双方。小蓝持白棋,小桥持黑棋

先手规则:白棋(小蓝)具有先手优势,即在棋盘空白时率先落子(下棋)

轮流落子:玩家们交替在棋盘上放置各自的棋子,每次仅放置一枚

胜利条件:率先在横线、竖线或斜线上形成连续的五个同色棋子的一方获胜

平局条件:当所有 25 个棋盘格都被下满棋子,而未决出胜负时,游戏以平局告终

在这一设定下,小蓝和小桥想知道,有多少种不同的棋局情况,既确保棋盘下满又保证比赛结果为平局。

答案提交

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

问题分析

说实话在赛场看到这样的题目,说不慌张都是骗人的,尤其是其还放在填空题中,这对于我们这种水平偏中下的同学来说更是一个较为严峻的挑战。

本题在官方的难度分类中为中等题,但是在小玉看来,其难度就算在中等,那也是中等中偏难的那种,所以没有解题成功的同学并不需要慌张,也不要气馁,你能够在编程软件上敲下你的想法,就已经超过了赛场上的很多人!(这是真的!很多时候我们更应该做的是相信自己 (ง๑ •̀_•́)ง )

言归正传,万事开头难,我们先来简单分析一下这个题目!

这里的关键是统计所有可能的满盘棋局,并确保没有出现五子连珠的情况。由于棋盘规模是 5×5,共有 25!  种不同的落子顺序,直接遍历是不可行的,需要更高效的方法。

我们可以采用回溯 + 剪枝的方法进行搜索:

  1. 回溯搜索:逐步填充棋盘,每次轮流落子(白棋先手)。
  2. 剪枝:在填充的过程中,如果某个状态下已经形成五子连珠,则立即剪枝,不再继续。
  3. 终止条件:当棋盘填满时,若没有五子连珠的情况,则计数。

这个方法考虑了所有可能的棋局排列,并检查是否有五子连珠的情况。但由于 25!  过于庞大,直接使用排列组合的方法会导致计算量过大,优化点在于:

  • 使用位运算或更紧凑的数据结构 以减少存储开销
  • 提前剪枝 在确定某个局面已经形成五子连珠时尽早结束

如果需要进一步优化,可以考虑更复杂的数据结构如Zobrist哈希来避免重复计算。

上面是我一开始看到这个题目时脑子里所有冒出来的想法,先不管对不对,有想法就要坚持去实践!万一实现了呢 [狗头先欠着

下面是我开始解题时编写的python代码:

当然这个代码是错误的,因为只考虑到了逻辑上的可行性,并没有考虑到实际运算的可行性,有兴趣的同学可以将我错误示例与自己的相对比,在错误中学习

def generate_permutations(elements):"""递归生成列表元素的全排列(手工实现 permutations 生成器)参数:elements: list,需要生成排列的元素列表Yields:list: 一个排列组合"""# 基本情况:空列表只有一种排列(空列表)if len(elements) == 0:yield []else:# 遍历每个元素作为排列的第一个元素for i in range(len(elements)):# 排除当前元素后的剩余元素列表rest = elements[:i] + elements[i+1:]# 递归生成剩余元素的所有排列for p in generate_permutations(rest):# 将当前元素与子排列组合yield [elements[i]] + pdef check_five_in_a_row(board):"""检查五子棋棋盘是否存在五连珠情况参数:board: list[list[int]],5x5的二维数组,0表示空,1/2表示玩家返回:bool: 是否存在五连珠"""def check_line(x, y, dx, dy):"""检查从(x,y)出发,沿(dx,dy)方向是否存在五连珠参数:x, y: 起始坐标dx, dy: 方向步长(取值应为0或±1)返回:bool: 是否五连"""color = board[x][y]# 空位置直接返回否if color == 0:return False# 检查连续五个位置for i in range(1, 5):  # 只需要检查后续四个位置(共五个)nx, ny = x + i*dx, y + i*dy# 确保不会越界(根据调用方式其实不需要,但保留更安全)if nx >= 5 or ny >= 5 or nx < 0 or ny < 0:return Falseif board[nx][ny] != color:return Falsereturn True# 检查所有可能的五连珠路线for i in range(5):# 横向检查(每行的起始位置)if check_line(i, 0, 0, 1):return True# 纵向检查(每列的起始位置)if check_line(0, i, 1, 0):return True# 对角线检查return check_line(0, 0, 1, 1) or check_line(0, 4, 1, -1)def count_draw_games():"""计算所有可能的平局棋局数量(无五连珠的完整棋盘)注意:此实现因时间复杂度为O(25!)而无法实际运行,仅作为逻辑演示返回:int: 平局数量(理论值)"""# 生成所有棋盘位置坐标positions = [(i, j) for i in range(5) for j in range(5)]draw_count = 0# 遍历所有可能的落子顺序排列for perm in generate_permutations(positions):# 初始化空棋盘board = [[0] * 5 for _ in range(5)]# 模拟落子过程for turn, (x, y) in enumerate(perm):# 交替玩家落子(玩家1先手)board[x][y] = 1 if turn % 2 == 0 else 2# 每次落子后立即检查五连珠if check_five_in_a_row(board):break  # 出现五连则终止当前棋局else:# 完整25步且无五连珠的情况计数draw_count += 1return draw_count# 注意:实际运行时本代码无法完成计算
print(count_draw_games())

好!现在我们来真正地说一说本题的正确打开方式:

首先,如果你想要顺利的解出本题,那么你需要了解一个至关重要的知识点:将线性位置转换为二维坐标,这个思路可以用于解决所有和本题相似的题目中

如果你不清楚这个知识点,请你将下面得到两个式子记住,如果你想了解这个式子是如何推导得到的,欢迎访问我的个人网站,在算法必备知识点模块数学篇可以找到相关的推导(好吧现在网站没有了wuwuwuwu),好消息是,我找到了一个大佬写的解析:希望可以为你解惑关于坐标压缩式子的解压缩式子-CSDN博客

    x = (position - 1) // line_size + 1  # 行坐标y = (position - 1) % line_size + 1    # 列坐标

假设现在有一个坐标轴,那么其中的position为坐标轴上的刻度,也就是线性坐标X,line_size为你希望将其转换到二维坐标系下的坐标系长度(二维平面XOY,我们假设这个平面就像棋盘一样,每一边都有其边长,其中line_size就是这个边长),此后我们便可以通过这个式子计算转换之后的每个点对应的二维坐标!在本题中,我们还应该注意到:两条对角线索引计算的差异

  • 主对角线:x+y(范围2-10)

  • 副对角线:x-y+5(转换负数为正数,范围1-9)

其次,我们需要使用四个数组分别跟踪行、列、对角线的棋子差值(白棋+1,黑棋-1),由于棋盘上总共能放下 5x5 共25个棋子,且 白棋先手,轮流落子因此我们可以认为:

        初始白子:13颗

        初始黑子:12颗

而防止有一方连成5子赢得比赛,我们应该有对于二者棋子数量的    绝对值的限制(<4),以确保同一颜色不会出现5连。

这点也可以成为我们后续简化代码的关键剪枝条件:

  • 白棋条件:各方向统计值 <4(保证还能放白棋)

  • 黑棋条件:各方向统计值 >-4(保证还能放黑棋)

代码描述:

当分析到这里,对于知识点掌握比较扎实的同学应该可以猜到小玉要使用什么算法来解决本题了,没错!就是你想的那种!就是——记忆化搜索+启发式剪枝+并行计算(劝退)

我们大概来介绍一下这几个小方向:

  1. 记忆化搜索

     缓存重复出现的棋盘状态
  2. 并行计算

    将搜索树分解为多个子树并行处理
  3. 启发式剪枝

    提前识别无效路径(如双方都无法形成连线)

其实这三个内容在上面的思路分析部分已经多多少少提到过了,有没有课代表愿意画画重点呢?(要考的!)那么本题的具体代码如下,让我们跟着思路一步一步实现:

  1. 初始化棋盘尺寸和平局计数器

    • board_size 设置棋盘的大小为5。
    • draw_count 用来记录平局的次数。
       
      board_size = 5 # 棋盘边长,本题为正方形棋盘
      draw_count = 0 # 记录平局的次数

  2. 创建棋盘状态跟踪系统

    • 使用四个数组来分别跟踪行、列、主对角线和副对角线上的棋子差值。白棋记为+1,黑棋记为-1。

    • row_count:行差值统计数组,长度为 board_size + 1,索引从1开始。

    • col_count:列差值统计数组,长度和索引同上。

    • main_diag_count:主对角线差值统计数组,长度为 2 * board_size + 1,索引对应于对角线上的位置。

    • anti_diag_count:副对角线差值统计数组,长度同上,索引对应于副对角线上的位置。

      # 统计数组,分别记录行、列、主对角线、副对角线的棋子数
      row_count = [0] * (board_size + 1)
      col_count = [0] * (board_size + 1)
      main_diag_count = [0] * (2 * board_size + 1)
      anti_diag_count = [0] * (2 * board_size + 1)
  3. 定义递归函数 count_draw_games

    • 参数 position 表示当前放置棋子的位置(从1开始)。

    • 参数 white_pieces 和 black_pieces 分别表示剩余可以放置的白棋和黑棋的数量。

    • 从线性坐标轴上看,当 position 达到棋盘大小的平方加一时,表示所有位置已填满,此时增加 draw_count,即达到和棋条件

    • 将线性位置转换为二维坐标(行 x 和列 y)。

  4. def count_draw_games(position, white_pieces, black_pieces):global draw_count# 终止条件:所有位置已填满if position == board_size * board_size + 1:draw_count += 1return# 将线性位置转换为二维坐标(1-based)x = (position - 1) // board_size + 1  # 行坐标(1-5)y = (position - 1) % board_size + 1    # 列坐标(1-5)# 尝试放置白棋(先手方需要多一个棋子)if white_pieces > 0:# 剪枝条件:保证所有方向上白棋不超过4个if (row_count[x] < board_size - 1 and           # 行方向还能放白棋col_count[y] < board_size - 1 and           # 列方向还能放白棋main_diag_count[x + y] < board_size - 1 and # 主对角线方向anti_diag_count[x - y + board_size] < board_size - 1): # 副对角线方向# 更新所有跟踪数组row_count[x] += 1col_count[y] += 1main_diag_count[x + y] += 1anti_diag_count[x - y + board_size] += 1# 递归处理下一个位置count_draw_games(position + 1, white_pieces - 1, black_pieces)# 回溯:恢复状态row_count[x] -= 1col_count[y] -= 1main_diag_count[x + y] -= 1anti_diag_count[x - y + board_size] -= 1# 尝试放置黑棋if black_pieces > 0:# 剪枝条件:保证所有方向上黑棋不超过4个# 注意这里的比较方向是反的(因为黑棋用负数表示)if (row_count[x] > 1 - board_size and           # 行方向还能放黑棋col_count[y] > 1 - board_size and           # 列方向还能放黑棋main_diag_count[x + y] > 1 - board_size and # 主对角线方向anti_diag_count[x - y + board_size] > 1 - board_size):# 更新所有跟踪数组(黑棋用减法)row_count[x] -= 1col_count[y] -= 1main_diag_count[x + y] -= 1anti_diag_count[x - y + board_size] -= 1# 递归处理下一个位置count_draw_games(position + 1, white_pieces, black_pieces - 1)# 回溯:恢复状态row_count[x] += 1col_count[y] += 1main_diag_count[x + y] += 1anti_diag_count[x - y + board_size] += 1

    以上便是本题的所有代码了,以下是上述代码的总结:

    # 棋盘尺寸
    board_size = 5
    # 平局计数器
    draw_count = 0"""
    创新性的棋盘状态跟踪系统:
    使用四个数组分别跟踪行、列、对角线的棋子差值(白棋+1,黑棋-1)
    这种设计使得我们可以在 O(1) 时间内判断是否允许落子
    """
    # 行差值统计(索引1-5)
    row_count = [0] * (board_size + 1)
    # 列差值统计(索引1-5)
    col_count = [0] * (board_size + 1)
    # 主对角线(左上到右下)差值统计(x+y范围:2-10)
    main_diag_count = [0] * (2 * board_size + 1)
    # 副对角线(右上到左下)差值统计(x-y+5范围:1-9)
    anti_diag_count = [0] * (2 * board_size + 1)def count_draw_games(position, white_pieces, black_pieces):global draw_count# 终止条件:所有位置已填满if position == board_size * board_size + 1:draw_count += 1return# 将线性位置转换为二维坐标(1-based)x = (position - 1) // board_size + 1  # 行坐标(1-5)y = (position - 1) % board_size + 1    # 列坐标(1-5)# 尝试放置白棋(先手方需要多一个棋子)if white_pieces > 0:# 剪枝条件:保证所有方向上白棋不超过4个if (row_count[x] < board_size - 1 and           # 行方向还能放白棋col_count[y] < board_size - 1 and           # 列方向还能放白棋main_diag_count[x + y] < board_size - 1 and # 主对角线方向anti_diag_count[x - y + board_size] < board_size - 1): # 副对角线方向# 更新所有跟踪数组row_count[x] += 1col_count[y] += 1main_diag_count[x + y] += 1anti_diag_count[x - y + board_size] += 1# 递归处理下一个位置count_draw_games(position + 1, white_pieces - 1, black_pieces)# 回溯:恢复状态row_count[x] -= 1col_count[y] -= 1main_diag_count[x + y] -= 1anti_diag_count[x - y + board_size] -= 1# 尝试放置黑棋if black_pieces > 0:# 剪枝条件:保证所有方向上黑棋不超过4个# 注意这里的比较方向是反的(因为黑棋用负数表示)if (row_count[x] > 1 - board_size and           # 行方向还能放黑棋col_count[y] > 1 - board_size and           # 列方向还能放黑棋main_diag_count[x + y] > 1 - board_size and # 主对角线方向anti_diag_count[x - y + board_size] > 1 - board_size):# 更新所有跟踪数组(黑棋用减法)row_count[x] -= 1col_count[y] -= 1main_diag_count[x + y] -= 1anti_diag_count[x - y + board_size] -= 1# 递归处理下一个位置count_draw_games(position + 1, white_pieces, black_pieces - 1)# 回溯:恢复状态row_count[x] += 1col_count[y] += 1main_diag_count[x + y] += 1anti_diag_count[x - y + board_size] += 1# 初始化递归(白棋13个,黑棋12个)
    count_draw_games(1, (board_size * board_size + 1) // 2, board_size * board_size // 2)print(draw_count)

结果提交

上述代码的运行结果:

将上述代码提交到蓝桥杯官网

写在后面

本题的成功解决也告诉我们,不应该随便忽略题设中的任何一个条件和字眼,也就是:审题是务必全面仔细!!!实际赛场中,如果你在未完全使用题设条件的前提下编写出了代码,那其在实际测试时的样例通过率可能会非常感人😭😭😭

有小伙伴私信提到实际运行时间上的问题,我想说的是,实际赛场上的测试软件中,对于python这个编程语言还是比较宽容的,所以其实并不用太过于焦虑担心运行用时这块的问题。

且本题只是一个填空题,并不需要多高超的解题方法,在分析实际代码的时间复杂度允许的情况下,我们完全可以选择舍弃一点时间来换取答案的准确性。

那么对于上述代码,其实还可以在某些地方再次进行简化,亲爱的小伙伴,请问你看出来了吗?欢迎在评论区交流哦~

相关文章:

1.五子棋对弈python解法——2024年省赛蓝桥杯真题

问题描述 原题传送门&#xff1a;1.五子棋对弈 - 蓝桥云课 "在五子棋的对弈中&#xff0c;友谊的小船说翻就翻&#xff1f;" 不&#xff01;对小蓝和小桥来说&#xff0c;五子棋不仅是棋盘上的较量&#xff0c;更是心与心之间的沟通。这两位挚友秉承着"友谊第…...

python3+TensorFlow 2.x(三)手写数字识别

目录 代码实现 模型解析&#xff1a; 1、加载 MNIST 数据集&#xff1a; 2、数据预处理&#xff1a; 3、构建神经网络模型&#xff1a; 4、编译模型&#xff1a; 5、训练模型&#xff1a; 6、评估模型&#xff1a; 7、预测和可视化结果&#xff1a; 输出结果&#xff…...

杨辉三角(蓝桥杯2021年H)

输入一个数字&#xff0c;看杨辉三角压缩矩阵第几个数与之相等。 #include<iostream> using namespace std; /* typedef struct Node {int* data;int size;Node* next; }Node,*Linklist; */ int C(int a,int b) {//求解组合数int c 1,div 1;if (b 0) {c 1;}else {fo…...

【蓝桥杯嵌入式入门与进阶】2.与开发板之间破冰:初始开发板和原理图2

个人主页&#xff1a;Icomi 专栏地址&#xff1a;蓝桥杯嵌入式组入门与进阶 大家好&#xff0c;我是一颗米&#xff0c;本篇专栏旨在帮助大家从0开始入门蓝桥杯并且进阶&#xff0c;若对本系列文章感兴趣&#xff0c;欢迎订阅我的专栏&#xff0c;我将持续更新&#xff0c;祝你…...

C++ queue

队列用vector<int>好不好 不好 为什么&#xff1f; 因为队列是先进先出 vector没有提供头删&#xff08;效率太低&#xff09; 要强制适配也可以 就得用erase函数和begin函数了 库里面的队列是不支持vector<int>的 queue实现 #pragma once #include<vector…...

【MySQL-7】事务

目录 1. 整体学习思维导图 2. 什么是事务 2.1 事务的概念 2.2 事务的属性(ACID) 2.3 事务出现的原因 2.4 查看存储引擎对事务的支持 3. 事务的使用 3.1 事务的提交方式 3.1.1 手动提交 3.1.2 自动提交 结论&#xff1a; 3.2 事务的隔离级别 3.2.1 理解隔离 3.2.2…...

03链表+栈+队列(D1_链表(D1_基础学习))

目录 一、什么是链表 二、基本操作 三、为什么要使用链表 四、为什么能够在常数时间访问数组元素 数组优点 数组缺点 五、动态数组诞生 链表优点 链表缺点 六、链表、数组和动态数组的对比 七、 链表种类 1. 单向链表 2. 双向链表 3. 循环链表 八、链表衍生 ...…...

Git 出现 Please use your personal access token instead of the password 解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法前言 1. 问题所示 执行Git提交代码的时候,出现如下所示: lixiaosong@IT07 MINGW64 /f/java_project/JavaDemo (master) $ git push -u origin --all libpng warning: iCCP: known incorrect sRGB profile libpng warning...

AI大模型开发原理篇-1:语言模型雏形之N-Gram模型

N-Gram模型概念 N-Gram模型是一种基于统计的语言模型&#xff0c;用于预测文本中某个词语的出现概率。它通过分析一个词语序列中前面N-1个词的出现频率来预测下一个词的出现。具体来说&#xff0c;N-Gram模型通过将文本切分为长度为N的词序列来进行建模。 注意&#xff1a;这…...

STM32新建不同工程的方式

新建工程的方式 1. 安装开发工具 MDK5 / keil52. CMSIS 标准3. 新建工程3.1 寄存器版工程3.2 标准库版工程3.3 HAL/LL库版工程3.4 HAL库、LL库、标准库和寄存器对比3.5 库开发和寄存器的关系 4. STM32CubeMX工具的作用 1. 安装开发工具 MDK5 / keil5 MDK5 由两个部分组成&#…...

【Rust自学】14.5. cargo工作空间(Workspace)

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 14.4.1. 为什么需要cargo workspace 假如说我们构建了一个二进制crate&#xff0c;里面既有library又有库。随着项目规模不断增长&#…...

全面了解 Web3 AIGC 和 AI Agent 的创新先锋 MelodAI

不管是在传统领域还是 Crypto&#xff0c;AI 都是公认的最有前景的赛道。随着数字内容需求的爆炸式增长和技术的快速迭代&#xff0c;Web3 AIGC&#xff08;AI生成内容&#xff09;和 AI Agent&#xff08;人工智能代理&#xff09;正成为两大关键赛道。 AIGC 通过 AI 技术生成…...

10.3 LangChain实战指南:解锁大模型应用的10大核心场景与架构设计

LangChain实战指南:解锁大模型应用的10大核心场景与架构设计 关键词: LangChain使用场景、LLM应用案例、检索增强生成、智能体开发、知识库问答 一、LangChain场景全景图:从简单到复杂的应用分层 #mermaid-svg-nzjpyXIPLzL0j3PG {font-family:"trebuchet ms",ver…...

Swing使用MVC模型架构

什么是MVC模式? MVC是一组英文的缩写,其全名是Model-View-Controller,也就是“模型-视图-控制器”这三个部分组成。这三个部分任意一个部分发生变化都会引起另外两个发生变化。三者之间的关系示意图如下所示: MVC分为三个部分,所以在MVC模型中将按照此三部分分成三…...

设计新的 Kibana 仪表板布局以支持可折叠部分等

作者&#xff1a;来自 Elastic Teresa Alvarez Soler, Hannah Mudge 及 Nathaniel Reese 在 Kibana 中构建可折叠仪表板部分需要彻底改造嵌入式系统并创建自定义布局引擎。这些更新改进了状态管理、层次结构和性能&#xff0c;同时为新的高级仪表板功能奠定了基础。 我们正在开…...

修改maven的编码格式为utf-8

1.maven默认编码为GBK 注:配好MAVEN_HOME的环境变量后,在运行cmd. 打开cmd 运行mvn -v命令即可. 2.修改UTF-8为默认编码. 设置环境变量 变量名 MAVEN_OPTS 变量值 -Xms256m -Xmx512m -Dfile.encodingUTF-8 3.保存,退出cmd.重新打开cmd 运行mvn -v命令即可. 源码获取&…...

解锁罗技键盘新技能:轻松锁定功能键(罗技K580)

在使用罗技键盘的过程中&#xff0c;你是否曾因 F11、F12 功能键的默认设置与实际需求不符而感到困扰&#xff1f; 别担心&#xff0c;今天就为大家分享一个简单实用的小技巧 —— 锁定罗技键盘的 F11、F12 功能键&#xff0c;让你的操作更加得心应手&#xff01; 通常情况下…...

HTB:Active[RE-WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…...

[C语言日寄] 源码、补码、反码介绍

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…...

安卓逆向之脱壳-认识一下动态加载 双亲委派(一)

安卓逆向和脱壳是安全研究、漏洞挖掘、恶意软件分析等领域的重要环节。脱壳&#xff08;unpacking&#xff09;指的是去除应用程序中加固或保护措施的过程&#xff0c;使得可以访问应用程序的原始代码或者数据。脱壳的重要性&#xff1a; 分析恶意软件&#xff1a;很多恶意软件…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

boost::filesystem::path文件路径使用详解和示例

boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类&#xff0c;封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解&#xff0c;包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...