LVGL移植2048小游戲全攻略

目錄

準備腳手架

修改源碼

對接觸摸

測試編譯

測試運行


這一節將以一個已經編寫好的?lvgl?小游戲?2048?描述如何將已經編寫完成的?lvgl?程序移植到開發板上。

準備腳手架

在這之前,我們先準備基礎的 LVGL 腳手架。可以直接從?lv_g2d_test?里復制過來進行修改即可。

首先我們復制源碼,在?platform/thirdparty/gui/lvgl-8?源碼文件夾里,把 紅箭頭 所指的?lv_g2d_test?的源碼作為模板復制到黃箭頭指向的?lv_2048?文件夾里。

如下圖所示,并清理下?res?資源文件夾,

2022-07-18-13-53-08-1658123584(1).png

同樣的,復制一份引索文件,找到?openwrt/package/thirdparty/gui/lvgl-8?并把?lv_g2d_test?復制一份重命名為?lv_2048?作為我們?2048?小游戲使用的引索。

2022-07-18-13-53-55-1658123630(1).png

并編輯?Makefile,修改文件名稱,把?lv_g2d_test?修改為這里的?lv_2048

include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/package.mk
include ../sunxifb.mkPKG_NAME:=lv_2048
PKG_VERSION:=8.1.0
PKG_RELEASE:=1PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
SRC_CODE_DIR := $(LICHEE_PLATFORM_DIR)/thirdparty/gui/lvgl-8/$(PKG_NAME)
define Package/$(PKG_NAME)SECTION:=guiSUBMENU:=LittlevglCATEGORY:=GuiDEPENDS:=+LVGL8_USE_SUNXIFB_G2D:libuapi +LVGL8_USE_SUNXIFB_G2D:kmod-sunxi-g2d \+LVGL8_USE_FREETYPE:libfreetypeTITLE:=lvgl 2048 
endefPKG_CONFIG_DEPENDS := \CONFIG_LVGL8_USE_SUNXIFB_DOUBLE_BUFFER \CONFIG_LVGL8_USE_SUNXIFB_CACHE \CONFIG_LVGL8_USE_SUNXIFB_G2D \CONFIG_LVGL8_USE_SUNXIFB_G2D_ROTATEdefine Package/$(PKG_NAME)/config
endefdefine Package/$(PKG_NAME)/Default
endefdefine Package/$(PKG_NAME)/descriptiona lvgl 2048 v8.1.0
endefdefine Build/Prepare$(INSTALL_DIR) $(PKG_BUILD_DIR)/$(CP) -r $(SRC_CODE_DIR)/src $(PKG_BUILD_DIR)/$(CP) -r $(SRC_CODE_DIR)/../lvgl $(PKG_BUILD_DIR)/src/$(CP) -r $(SRC_CODE_DIR)/../lv_drivers $(PKG_BUILD_DIR)/src/
endefdefine Build/Configure
endefTARGET_CFLAGS+=-I$(PKG_BUILD_DIR)/srcifeq ($(CONFIG_LVGL8_USE_SUNXIFB_G2D),y)
TARGET_CFLAGS+=-DLV_USE_SUNXIFB_G2D_FILL \-DLV_USE_SUNXIFB_G2D_BLEND \-DLV_USE_SUNXIFB_G2D_BLIT \-DLV_USE_SUNXIFB_G2D_SCALE
endifdefine Build/Compile$(MAKE) -C $(PKG_BUILD_DIR)/src\ARCH="$(TARGET_ARCH)" \AR="$(TARGET_AR)" \CC="$(TARGET_CC)" \CXX="$(TARGET_CXX)" \CFLAGS="$(TARGET_CFLAGS)" \LDFLAGS="$(TARGET_LDFLAGS)" \INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \all
endefdefine Package/$(PKG_NAME)/install$(INSTALL_DIR) $(1)/usr/bin/$(INSTALL_DIR) $(1)/usr/share/lv_2048$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/$(PKG_NAME) $(1)/usr/bin/
endef$(eval $(call BuildPackage,$(PKG_NAME)))

完成腳手架的搭建后,可以?make menuconfig?里查看是否出現了?lv_2048?這個選項,選中它。

2022-07-18-13-56-31-image.png

修改源碼

第二步是修改源碼。編輯之前復制的?main.c?文件,把不需要的?lv_g2d_test?的部分刪去。保留最基礎的部分。

#include "lvgl/lvgl.h"
#include "lv_drivers/display/sunxifb.h"
#include "lv_drivers/indev/evdev.h"
#include <unistd.h>
#include <pthread.h>
#include <time.h>
#include <sys/time.h>
#include <stdlib.h>
#include <stdio.h>static lv_style_t rect_style;
static lv_obj_t *rect_obj;
static lv_obj_t *canvas;int main(int argc, char *argv[]) {lv_disp_drv_t disp_drv;lv_disp_draw_buf_t disp_buf;lv_indev_drv_t indev_drv;uint32_t rotated = LV_DISP_ROT_NONE;lv_disp_drv_init(&disp_drv);/*LittlevGL init*/lv_init();/*Linux frame buffer device init*/sunxifb_init(rotated);/*A buffer for LittlevGL to draw the screen's content*/static uint32_t width, height;sunxifb_get_sizes(&width, &height);static lv_color_t *buf;buf = (lv_color_t*) sunxifb_alloc(width * height * sizeof(lv_color_t), "lv_2048");if (buf == NULL) {sunxifb_exit();printf("malloc draw buffer fail\n");return 0;}/*Initialize a descriptor for the buffer*/lv_disp_draw_buf_init(&disp_buf, buf, NULL, width * height);/*Initialize and register a display driver*/disp_drv.draw_buf = &disp_buf;disp_drv.flush_cb = sunxifb_flush;disp_drv.hor_res = width;disp_drv.ver_res = height;disp_drv.rotated = rotated;disp_drv.screen_transp = 0;lv_disp_drv_register(&disp_drv);evdev_init();lv_indev_drv_init(&indev_drv); /*Basic initialization*/indev_drv.type = LV_INDEV_TYPE_POINTER; /*See below.*/indev_drv.read_cb = evdev_read; /*See below.*//*Register the driver in LVGL and save the created input device object*/lv_indev_t *evdev_indev = lv_indev_drv_register(&indev_drv);/*Handle LitlevGL tasks (tickless mode)*/while (1) {lv_task_handler();usleep(1000);}return 0;
}/*Set in lv_conf.h as `LV_TICK_CUSTOM_SYS_TIME_EXPR`*/
uint32_t custom_tick_get(void) {static uint64_t start_ms = 0;if (start_ms == 0) {struct timeval tv_start;gettimeofday(&tv_start, NULL);start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000;}struct timeval tv_now;gettimeofday(&tv_now, NULL);uint64_t now_ms;now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;uint32_t time_ms = now_ms - start_ms;return time_ms;
}

接下來則是對接?lv_lib_100ask?與?2048?小游戲,我們先下載?lv_lib_100ask?的源碼,放置到?platform/thirdparty/gui/lvgl-8/lv_2048?的?src?文件夾里。并按照?lv_lib_100ask?的說明,復制一份?lv_lib_100ask_conf_template.h?到?src?目錄,并改名為?lv_lib_100ask_conf.h

2022-07-18-14-55-44-image.png

編輯?lv_lib_100ask_conf.h,開啟整個庫的引用,并配置啟用?LV_USE_100ASK_2048?。為了簡潔,這里刪除了不需要的配置項。

/*** @file lv_lib_100ask_conf.h* Configuration file for v8.2.0**/
/** COPY THIS FILE AS lv_lib_100ask_conf.h*//* clang-format off */
#if 1 /*Set it to "1" to enable the content*/ #ifndef LV_LIB_100ASK_CONF_H
#define LV_LIB_100ASK_CONF_H#include "lv_conf.h"/******************** GENERAL SETTING*******************//********************** USAGE*********************/*2048 game*/
#define LV_USE_100ASK_2048                               1
#if LV_USE_100ASK_2048/* Matrix size*//*Do not modify*/#define  LV_100ASK_2048_MATRIX_SIZE          4/*test*/#define  LV_100ASK_2048_SIMPLE_TEST          1
#endif  #endif /*LV_LIB_100ASK_H*/#endif /*End of "Content enable"*/

再編輯?platform/thirdparty/gui/lvgl-8/lv_2048/src/lv_lib_100ask/lv_lib_100ask.h?中的版本號,修改為?(8,1,0)

2022-07-18-15-13-39-image.png

之后在?main.c?里修改,對接?lv_100ask_2048_simple_test,具體如下。

(1)頭文件加入?lv_lib_100ask/lv_lib_100ask.h

#include <lv_lib_100ask/lv_lib_100ask.h>

(2)在?main?函數里添加接口調用

lv_100ask_2048_simple_test();

完整的?main.c?如下

#include <unistd.h>
#include <pthread.h>
#include <time.h>
#include <sys/time.h>
#include <stdlib.h>
#include <stdio.h>#include "lvgl/lvgl.h"
#include "lv_drivers/display/sunxifb.h"
#include "lv_drivers/indev/evdev.h"#include "lv_lib_100ask/lv_lib_100ask.h"  // 引用頭文件static lv_style_t rect_style;
static lv_obj_t *rect_obj;
static lv_obj_t *canvas;int main(int argc, char *argv[]) {lv_disp_drv_t disp_drv;lv_disp_draw_buf_t disp_buf;lv_indev_drv_t indev_drv;uint32_t rotated = LV_DISP_ROT_NONE;lv_disp_drv_init(&disp_drv);/*LittlevGL init*/lv_init();/*Linux frame buffer device init*/sunxifb_init(rotated);/*A buffer for LittlevGL to draw the screen's content*/static uint32_t width, height;sunxifb_get_sizes(&width, &height);static lv_color_t *buf;buf = (lv_color_t*) sunxifb_alloc(width * height * sizeof(lv_color_t), "lv_nes");if (buf == NULL) {sunxifb_exit();printf("malloc draw buffer fail\n");return 0;}/*Initialize a descriptor for the buffer*/lv_disp_draw_buf_init(&disp_buf, buf, NULL, width * height);/*Initialize and register a display driver*/disp_drv.draw_buf = &disp_buf;disp_drv.flush_cb = sunxifb_flush;disp_drv.hor_res = width;disp_drv.ver_res = height;disp_drv.rotated = rotated;disp_drv.screen_transp = 0;lv_disp_drv_register(&disp_drv);evdev_init();lv_indev_drv_init(&indev_drv); /*Basic initialization*/indev_drv.type = LV_INDEV_TYPE_POINTER; /*See below.*/indev_drv.read_cb = evdev_read; /*See below.*//*Register the driver in LVGL and save the created input device object*/lv_indev_t *evdev_indev = lv_indev_drv_register(&indev_drv);lv_100ask_2048_simple_test();  // 調用 2048 小游戲/*Handle LitlevGL tasks (tickless mode)*/while (1) {lv_task_handler();usleep(1000);}return 0;
}/*Set in lv_conf.h as `LV_TICK_CUSTOM_SYS_TIME_EXPR`*/
uint32_t custom_tick_get(void) {static uint64_t start_ms = 0;if (start_ms == 0) {struct timeval tv_start;gettimeofday(&tv_start, NULL);start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000;}struct timeval tv_now;gettimeofday(&tv_now, NULL);uint64_t now_ms;now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;uint32_t time_ms = now_ms - start_ms;return time_ms;
}

然后就是?Makefile?修改,增加一個?lv_lib_100ask?的 SRC 引用。

include lv_lib_100ask/lv_lib_100ask.mk

順便也把?BIN?改為?lv_2048?,完整的?Makefile?如下

#
# Makefile
#
CC ?= gcc
LVGL_DIR_NAME ?= lvgl
LVGL_DIR ?= ${shell pwd}
CFLAGS ?= -O3 -g0 -I$(LVGL_DIR)/ -Wall -Wshadow -Wundef -Wmissing-prototypes -Wno-discarded-qualifiers -Wall -Wextra -Wno-unused-function -Wno-error=strict-prototypes -Wpointer-arith -fno-strict-aliasing -Wno-error=cpp -Wuninitialized -Wmaybe-uninitialized -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wno-cast-qual -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wformat-security -Wno-ignored-qualifiers -Wno-error=pedantic -Wno-sign-compare -Wno-error=missing-prototypes -Wdouble-promotion -Wclobbered -Wdeprecated -Wempty-body -Wtype-limits -Wshift-negative-value -Wstack-usage=2048 -Wno-unused-value -Wno-unused-parameter -Wno-missing-field-initializers -Wuninitialized -Wmaybe-uninitialized -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wpointer-arith -Wno-cast-qual -Wmissing-prototypes -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wno-discarded-qualifiers -Wformat-security -Wno-ignored-qualifiers -Wno-sign-compare
LDFLAGS ?= -lm
BIN = lv_2048#Collect the files to compile
SRCDIRS   =  $(shell find . -maxdepth 1 -type d)
MAINSRC = $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c))include $(LVGL_DIR)/lvgl/lvgl.mk
include $(LVGL_DIR)/lv_drivers/lv_drivers.mk
include lv_lib_100ask/lv_lib_100ask.mkOBJEXT ?= .oAOBJS = $(ASRCS:.S=$(OBJEXT))
COBJS = $(CSRCS:.c=$(OBJEXT))MAINOBJ = $(MAINSRC:.c=$(OBJEXT))SRCS = $(ASRCS) $(CSRCS) $(MAINSRC)
OBJS = $(AOBJS) $(COBJS)## MAINOBJ -> OBJFILESall: default%.o: %.c@$(CC)  $(CFLAGS) -c $< -o $@@echo "CC $<"default: $(AOBJS) $(COBJS) $(MAINOBJ)$(CC) -o $(BIN) $(MAINOBJ) $(AOBJS) $(COBJS) $(LDFLAGS)clean: rm -f $(BIN) $(AOBJS) $(COBJS) $(MAINOBJ)

對接觸摸

做了以上操作,可能會發現觸摸沒有反應,這是因為觸摸綁定的?event?事件號不對,默認的綁定是?event3?而查閱啟動?log?可知,開發板的觸摸屏對接的是?event0

2022-07-18-15-17-48-image.png

這時需要修改綁定的?event?事件號,其配置文件在?lv_drv_conf.h?內:

2022-07-18-15-19-12-image.png

這里將?event3?改為?event0?即可

#  define EVDEV_NAME   "/dev/input/event0"

當然除了這樣的方法,另外也可以用命令生成軟連接?touchscreen,就會直接以?touchscreen?為觸摸節點,方便調試:

ln -s /dev/input/eventX /dev/input/touchscreen

測試編譯

修改好了,希望單獨編譯這個包測試下而不編譯完整的 SDK。可以這樣做:

(1)確保已經?source build/envsetup.sh?并已經?lunch

(2)在任意文件夾下執行命令?mmo lv_2048 -B

其中?mmo?的意思是 單獨編譯一個?openWrt?軟件包,后面的?lv_2048?是軟件包名。-B?參數是先?clean?再編譯,不加這個參數就是直接編譯了。

測試運行

編譯打包后,到開發板上使用?lv_2048?即可運行

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96813.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96813.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在Unity2021中使用Profiler的Deep Profile功能時內存超高怎么辦?

這通常是因為Deep Profile會記錄每一幀所有函數調用的詳細信息&#xff0c;導致內存急劇增長&#xff0c;尤其在大型項目或復雜場景中4。別擔心&#xff0c;我來幫你分析原因并提供一些解決辦法。 理解 Deep Profile 的內存開銷與替代方案 Deep Profile是Unity Profiler的一個…

Ubuntu 設置中文輸入法

一、使用 IBus&#xff08;Ubuntu 默認框架&#xff09;步驟 1&#xff1a;安裝中文輸入法sudo apt install ibus-libpinyin ibus-pinyin步驟 2&#xff1a;添加輸入法打開 Settings > Keyboard > Input Sources。點擊 “”&#xff0c;搜索 Chinese (Intelligent Pinyin…

【Zephyr電源與功耗專題】14_BMS電池管理算法(三重驗證機制實現高精度電量估算)

文章目錄前言一、算法系統框架設計介紹1.1&#xff1a;核心設計方式1.2&#xff1a;系統架構圖1.3&#xff1a;核心參數配置二、核心算法詳解2.1&#xff1a;硬件數據采集與濾波2.2&#xff1a;三重算法機制2.2.1&#xff1a;庫侖計法&#xff08;電流積分&#xff09;2.2.2&am…

Python網絡與多任務編程:TCP/UDP實戰指南

Python網絡與多任務編程&#xff1a;TCP/UDP實戰指南 一、網絡編程 1.1 前言 網絡編程是現代軟件開發中不可或缺的一部分&#xff0c;它使得不同設備之間的數據交換成為可能。Python提供了強大的標準庫來支持各種網絡編程需求。 1.1.1 IP地址簡介 IP地址是互聯網上設備的唯一標…

Android8 binder源碼學習分析筆記(四)——ServiceManager啟動

前文回顧&#xff1a; Android8 binder源碼學習分析筆記&#xff08;三&#xff09;&#xff1a; https://blog.csdn.net/g_i_a_o_giao/article/details/151365630?spm1001.2014.3001.5502 Android8 binder源碼學習分析筆記&#xff08;二&#xff09;&#xff1a; https://…

Redis 大 Key 與熱 Key:生產環境的風險與解決方案

&#x1f525; Redis 大 Key 與熱 Key&#xff1a;生產環境的風險與解決方案 文章目錄&#x1f525; Redis 大 Key 與熱 Key&#xff1a;生產環境的風險與解決方案&#x1f9e0; 一、問題定義與識別&#x1f4a1; 什么是大 Key&#xff1f;&#x1f525; 什么是熱 Key&#xff…

C++算法題中的輸入輸出形式(I/O)

本文主要幫助刷leetcode題型快速適應完整帶輸入輸出的題&#xff08;機試、考試、比賽等&#xff09;接收能用cin就用cin 。cin 自動分割單詞 的特性&#xff08;cin 讀取字符串時會自動跳過空格 / 換行&#xff0c;將連續非空格字符作為一個 “單詞”&#xff09;一、單組輸入…

【左程云算法09】棧的入門題目-最小棧

目錄 棧的入門題目-最小棧 代碼演示 視頻鏈接 算法講解015【入門】棧的入門題目-最小棧 Leecode155 棧的入門題目-最小棧 實現一個getmin方法&#xff08;高效方法&#xff0c;即不用遍歷&#xff09;&#xff0c;希望能實現O&#xff08;1&#xff09; 做法&#xff1a…

Grafana與Prometheus實戰

&#x1f31f;Grafana的Dashboard的權限管理 創建團隊 創建用戶 設置團隊權限 &#x1f31f;Prometheus啟用https及認證功能 自建ca的證書 準備證書目錄 mkdir /app/tools/prometheus-2.53.4.linux-amd64/certs cd /app/tools/prometheus-2.53.4.linux-amd64/certs生成ca的…

FPGA交通燈設計報告(源碼+管腳約束+實物圖+設計報告)

基于FPGA的交通燈設計 摘要 本設計采用FPGA技術實現了一個智能交通燈控制系統。系統以Verilog HDL為設計語言,在FPGA平臺上實現了交通燈的自動控制、數碼管倒計時顯示、緊急情況處理等功能。通過合理的狀態機設計和模塊化編程,系統具有良好的實時性、可靠性和可擴展性,能夠…

技術論文分析分析論文《計算機病毒判定專家系統原理與設計》思考其在游戲中的應用

論文原文的引言主要有兩大部分的內容&#xff1a;介紹計算機病毒&#xff0c;明確本文使用的病毒分類方式&#xff1b;分析傳統計算機病毒檢測存在的弊端。對于計算機病毒的定義&#xff0c;文中給出的定義比較嚴謹&#xff0c;我自己查了一下現在百度百科的定義&#xff0c;兩…

《Unity項目實戰:動態加載引發的顯存危機全鏈路排查與重構實踐》

從動態光影那流光溢彩、仿佛賦予虛擬世界真實質感的絢麗效果—這得益于Unity引擎強大的HDRP管線對光照路徑的精準模擬,到物理引擎驅動的物體碰撞精準到毫厘的物理反饋—依托Unity Physics模塊對剛體動力學的毫秒級計算,再到能夠依據不同設備性能自動適配的畫質表現—通過Unit…

智慧水庫綜合管理系統平臺御控物聯網解決方案

一、行業背景與痛點分析水庫作為防洪、灌溉、供水、發電及生態保護的核心基礎設施&#xff0c;其管理效率直接關系到區域水資源安全與可持續發展。然而&#xff0c;傳統水庫管理模式存在四大核心痛點&#xff1a;數據孤島嚴重&#xff1a;水位、雨量、水質、設備狀態等數據分散…

使用nvm安裝Node.js18以下報錯解決方案——The system cannot find the file specified.

使用 nvm 安裝 Node.js 18以下 報錯解決方案 在前端開發過程中&#xff0c;常常需要針對不同項目切換 Node.js 版本。nvm&#xff08;Node Version Manager&#xff09;是最常用的工具。但最近在嘗試安裝 Node.js 14 版本時&#xff0c;遇到了奇怪的錯誤。 問題描述 使用 nv…

在Excel和WPS表格中快速復制上一行內容

有的時候我們在Excel和WPS表格中想復制上一行對應單元格、連續區域或整行的內容&#xff0c;只需要在當前行拖動鼠標左鍵選中相關區域&#xff0c;然后按CtrlD鍵即可將上一行對應位置的內容復制過來——需要注意的是&#xff0c;如果當前行有數據&#xff0c;這些數據會直接被覆…

408學習之c語言(遞歸與函數)

今天主要學習了遞歸與函數的相關內容&#xff0c;下面將我今天所學知識與所寫代碼分享給大家 遞歸核心要點 遞歸三要素 基準條件&#xff08;明確終止條件&#xff09; 遞歸調用&#xff08;逐步分解問題&#xff09; 收斂性&#xff08;確保每次遞歸都向基準條件靠近&#xff…

swVBA自學筆記016、Solidworks API Help 幫助文檔的(三大版塊)

目錄1. Namespace (命名空間) 版塊2. Interface (接口) 版塊3. Members (接口成員) 版塊4、總結關系5、如果你感覺上面說的過于簡單&#xff0c;請往下看!6、示例鏈接→SOLIDWORKS API Help 20197、需要注意的是&#xff0c;帶“I”的對象表示&#xff1a;接口1. Namespace (命…

通俗易懂地講解JAVA的BIO、NIO、AIO

理解Java的I/O模型&#xff08;BIO、NIO、AIO&#xff09;對于構建高性能網絡應用至關重要 &#x1f9e0; 通俗理解&#xff1a;快遞站的故事 想象一個快遞站&#xff1a; ? BIO&#xff1a;就像快遞站為每一個包裹都安排一位專員。專員從接到包裹到處理完&#xff08;簽收、…

LabVIEW 泵輪檢測系統

在汽車行業&#xff0c;泵輪作為液力變矩器關鍵部件&#xff0c;其質量檢測極為重要。傳統手工檢測泵輪效率低且誤差大&#xff0c;為此構建基于 LabVIEW 與西門子硬件結合的泵輪檢測系統。 應用場景 聚焦汽車零部件生產車間&#xff0c;對泵輪總成進行出廠前檢測。在液力變矩…

2025年8月月賽 T2 T3

一. 七天假日 T2原思路&#xff1a;直接計算左右括號的數量&#xff0c;然后直接輸出他們的差改進思路&#xff1a; 用d值記錄截止到當前位置&#xff0c;還需要多少個右括號可以滿足非法要求cur&#xff1a;截止到當前位置&#xff0c;已經有多少個右括號sum是右括號位置的前綴…