当前位置: 首页 > 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;很多恶意软件…...

Nuxt:利用public-ip这个npm包来获取公网IP

目录 一、安装public-ip包1.在Vue组件中使用2.在Nuxt.js插件中使用public-ip 一、安装public-ip包 npm install public-ip1.在Vue组件中使用 你可以在Nuxt.js的任意组件或者插件中使用public-ip来获取公网IP。下面是在一个Vue组件中如何使用它的例子&#xff1a; <template…...

babylon.js-3:了解STL网格模型

网格模型上色 本篇文章主要介绍如何在 BabylonJS 中实现STL网格模型上色。 文章目录 网格模型上色运用场景概要延申正文加载器库的支持认识 OBJ 和 STL 文件GUI 色板选择器网格模型异步加载加载动画网格模型上色官方即将弃用 ImportMesh 而推荐使用 ImportMeshAsync 说明OBJ …...

基于SpringBoot的假期周边游平台的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

【MySQL】初始MySQL、库与表的操作

目录 基本使用 使用案例 SQL分类 存储引擎 库的操作 字符集和校验规则 查看系统默认字符集和校验规则 查看数据库支持的字符集 查看数据库支持的字符集校验规则 指定编码常见数据库 校验规则对数据库的影响 操纵数据库 库的备份与恢复 表的操作 创建表 查看表 …...

将DeepSeek接入Word,打造AI办公助手

最近&#xff0c;DeepSeek热度一路高涨&#xff0c;成为AI领域的焦点。通过开放的API&#xff0c;我们可以将DeepSeek接入Word&#xff0c;直接进行AI对话。更进一步&#xff0c;还能利用DeepSeek辅助修改文档&#xff0c;甚至提出一些排版建议。 Word报告工具已经新增“DeepS…...

Coze,Dify,FastGPT,对比

在当今 AI 技术迅速发展的背景下&#xff0c;AI Agent 智能体成为了关键领域&#xff0c;Coze、Dify 和 FastGPT 作为其中的佼佼者&#xff0c;各有千秋。 平台介绍 - FastGPT&#xff1a;由环界云计算公司发起&#xff0c;是基于大语言模型&#xff08;LLM&#xff09;的开源…...

Kafka 日志存储 — 磁盘存储

Kafka 依赖与磁盘来存储和缓存消息&#xff0c;采用文件追加的方式来写入消息。顺序写盘的速度快于随机写内存。 1 磁盘存储 除顺序写入外&#xff0c;Kafka中大量使用了页缓存、零拷贝等技术来进一步提升吞吐性能。 1.1 页缓存 页缓存是操作系统实现的一种磁盘缓存&#x…...

996引擎 - NPC-添加NPC引擎自带形象

996引擎 - NPC-添加NPC引擎自带形象 截图参考添加NPC参考资料截图参考 添加NPC 编辑NPC表:Envir\DATA\cfg_npclist.xls 1.1. 需要临时隐藏NPC时可以在id前加 // 1.2. 如果NPC朝向不对,可以调整dir 列。(按8方向,上是0顺时针数。我这里给的4) 1.3. 形象代码:NPC代码、怪物…...

GL C++显示相机YUV视频数据使用帧缓冲FBO后期处理,实现滤镜功能。

一.前言&#xff1a; GitHub地址&#xff1a;GitHub - wangyongyao1989/WyFFmpeg: 音视频相关基础实现 系列文章&#xff1a; 1. OpenGL Texture C 预览Camera视频&#xff1b; 2. OpenGL Texture C Camera Filter滤镜; 3. OpenGL 自定义SurfaceView Texture C预览Camera视…...

【hot100】刷题记录(7)-除自身数组以外的乘积

题目描述&#xff1a; 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#x…...