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

华为OD机试 - 猜数字 - 暴力枚举(Python/JS/C/C++ 2024 E卷 100分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

一个人设定一组四码的数字作为谜底,另一方猜。

每猜一个数,出题者就要根据这个数字给出提示,提示以XAYB形式呈现,直到猜中位置。

其中X表示位置正确的数的个数(数字正确且位置正确),而Y表示数字正确而位置不对的数的个数。

例如,当谜底为8123,而猜谜者猜1052时,出题者必须提示0A2B。

例如,当谜底为5637,而猜谜者猜4931时,出题者必须提示1A0B。

当前已知N组猜谜者猜的数字与提示,如果答案确定,请输出答案,不确定则输出NA。

二、输入描述

第一行输入一个正整数N,0 < N < 100。

接下来N行,每一行包含一个猜测的数字与提示结果。

三、输出描述

输出最后的答案,答案不确定则输出NA。

四、测试用例

测试用例1

1、输入

3
1234 1A2B
5678 0A1B
9012 0A0B

2、输出

NA

3、说明

没有唯一符合所有提示的谜底,因此输出"NA"。

测试用例2

1、输入

2
0000 4A0B
1111 0A0B

2、输出

0000

3、说明

唯一符合所有提示的谜底是0000。

五、解题思路

本题的核心算法是穷举所有可能的四位数字组合(从0000到9999),即遍历所有可能的谜底。

对于每一个可能的谜底,逐一检查它是否能满足所有给定的提示。

1、为什么采用穷举搜索?

题目要求我们找出一个四位数的谜底,这意味着谜底的取值范围是从0000到9999,总共只有10000种可能。

对于计算机来说,遍历10000种可能性是一个非常可控的操作,执行时间相对较短。因此,使用穷举搜索可以在合理的时间内完成。

2、具体步骤:

  1. 枚举所有可能的谜底
    • 谜底是一个四位数,范围从0000到9999,总共有10000种可能性。
    • 我们需要遍历所有这些可能性,逐个验证它们是否符合所有提示。
  2. 验证每一个可能的谜底
    • 对于每一个可能的谜底,我们需要根据所有的提示验证它是否符合条件。
    • 提示格式为 XAYB,其中:
    • X 表示猜测中有多少个数字在正确的位置上。
    • Y 表示猜测中有多少个数字是正确的,但位置不对。
  3. 具体验证步骤如下:
    • 对于每个提示,计算当前可能谜底与猜测之间的 X 和 Y 值。
    • 将计算出的 X 和 Y 与输入的提示进行比较,如果不相等,则该可能的谜底无效。

3、复杂度分析

总共有10000个可能的四位数谜底。

对于每个可能的谜底,需要验证它是否符合N个提示。时间复杂度为 O(10000×N),在最坏情况下,N为100。

由于数据范围相对较小,穷举法可以在合理的时间内解决问题。

六、Python算法源码

# 导入必要的模块
import sysdef main():# 读取所有输入并按空白字符分割input = sys.stdin.read().split()index = 0# 读取猜测次数Nn = int(input[index])index += 1# 初始化猜测和提示的列表guesses = []hints = []# 读取每一组猜测和提示for _ in range(n):guesses.append(input[index])hints.append(input[index + 1])index += 2# 查找可能的谜底result = findPossibleAnswer(n, guesses, hints)# 输出结果print(result)def findPossibleAnswer(n, guesses, hints):possibleAnswer = None# 遍历所有可能的四位数字for i in range(10000):# 将数字格式化为四位字符串currentGuess = f"{i:04d}"isValid = True# 验证当前数字是否符合所有提示for j in range(n):# 生成当前猜测与谜底的提示hint = generateHint(currentGuess, guesses[j])# 如果提示不匹配,则当前数字不符合if hint != hints[j]:isValid = Falsebreak# 如果当前数字符合所有提示if isValid:if possibleAnswer is None:possibleAnswer = currentGuesselse:# 如果已经有一个符合的谜底,则不唯一,返回"NA"return "NA"# 返回唯一的谜底或"NA"return possibleAnswer if possibleAnswer is not None else "NA"def generateHint(answer, guess):A = 0  # 数字正确且位置正确的个数B = 0  # 数字正确但位置不对的个数# 标记已经匹配的数字answerUsed = [False] * 4guessUsed = [False] * 4# 先计算A值for i in range(4):if answer[i] == guess[i]:A += 1answerUsed[i] = TrueguessUsed[i] = True# 再计算B值for i in range(4):if not guessUsed[i]:for j in range(4):if not answerUsed[j] and guess[i] == answer[j]:B += 1answerUsed[j] = Truebreak# 返回提示字符串return f"{A}A{B}B"# 调用主函数
if __name__ == "__main__":main()

七、JavaScript算法源码

// 使用标准输入输出
process.stdin.resume();
process.stdin.setEncoding('utf8');let input = '';// 读取输入数据
process.stdin.on('data', function(chunk) {input += chunk;
});// 输入结束后处理数据
process.stdin.on('end', function() {// 按空白字符分割输入const tokens = input.trim().split(/\s+/);let index = 0;// 读取猜测次数Nconst n = parseInt(tokens[index++], 10);// 初始化猜测和提示的数组const guesses = [];const hints = [];// 读取每一组猜测和提示for(let i = 0; i < n; i++) {guesses.push(tokens[index++]);hints.push(tokens[index++]);}// 查找可能的谜底const result = findPossibleAnswer(n, guesses, hints);// 输出结果console.log(result);
});// 定义查找可能谜底的函数
function findPossibleAnswer(n, guesses, hints) {let possibleAnswer = null;// 遍历所有可能的四位数字for(let i = 0; i <= 9999; i++) {// 将数字格式化为四位字符串const currentGuess = i.toString().padStart(4, '0');let isValid = true;// 验证当前数字是否符合所有提示for(let j = 0; j < n; j++) {// 生成当前猜测与谜底的提示const hint = generateHint(currentGuess, guesses[j]);// 如果提示不匹配,则当前数字不符合if(hint !== hints[j]) {isValid = false;break;}}// 如果当前数字符合所有提示if(isValid) {if(possibleAnswer === null) {possibleAnswer = currentGuess;} else {// 如果已经有一个符合的谜底,则不唯一,返回"NA"return "NA";}}}// 返回唯一的谜底或"NA"return possibleAnswer !== null ? possibleAnswer : "NA";
}// 定义生成提示的函数
function generateHint(answer, guess) {let A = 0; // 数字正确且位置正确的个数let B = 0; // 数字正确但位置不对的个数// 标记已经匹配的数字const answerUsed = [false, false, false, false];const guessUsed = [false, false, false, false];// 先计算A值for(let i = 0; i < 4; i++) {if(answer[i] === guess[i]) {A += 1;answerUsed[i] = true;guessUsed[i] = true;}}// 再计算B值for(let i = 0; i < 4; i++) {if(!guessUsed[i]) {for(let j = 0; j < 4; j++) {if(!answerUsed[j] && guess[i] === answer[j]) {B += 1;answerUsed[j] = true;break;}}}}// 返回提示字符串return `${A}A${B}B`;
}

八、C算法源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 定义最大可能的谜底数量
#define MAX_POSSIBLE 10000// 函数声明
char* findPossibleAnswer(int n, char guesses[][5], char hints[][5]);
char* generateHint(char* answer, char* guess);int main(){int n;// 读取猜测次数Nscanf("%d", &n);// 动态分配猜测和提示的数组char (*guesses)[5] = malloc(n * sizeof(*guesses));char (*hints)[5] = malloc(n * sizeof(*hints));// 读取每一组猜测和提示for(int i = 0; i < n; i++) {scanf("%s %s", guesses[i], hints[i]);}// 查找可能的谜底char* result = findPossibleAnswer(n, guesses, hints);// 输出结果printf("%s\n", result);// 释放动态分配的内存free(guesses);free(hints);free(result);return 0;
}// 定义查找可能谜底的函数
char* findPossibleAnswer(int n, char guesses[][5], char hints[][5]) {char* possibleAnswer = NULL;// 遍历所有可能的四位数字for(int i = 0; i <= 9999; i++) {// 将数字格式化为四位字符串char currentGuess[5];sprintf(currentGuess, "%04d", i);int isValid = 1;// 验证当前数字是否符合所有提示for(int j = 0; j < n; j++) {// 生成当前猜测与谜底的提示char* hint = generateHint(currentGuess, guesses[j]);// 如果提示不匹配,则当前数字不符合if(strcmp(hint, hints[j]) != 0) {isValid = 0;free(hint);break;}free(hint);}// 如果当前数字符合所有提示if(isValid) {if(possibleAnswer == NULL) {possibleAnswer = malloc(5 * sizeof(char));strcpy(possibleAnswer, currentGuess);}else {// 如果已经有一个符合的谜底,则不唯一,返回"NA"free(possibleAnswer);return "NA";}}}// 返回唯一的谜底或"NA"if(possibleAnswer != NULL) {return possibleAnswer;}else {// 分配内存存储"NA"char* na = malloc(3 * sizeof(char));strcpy(na, "NA");return na;}
}// 定义生成提示的函数
char* generateHint(char* answer, char* guess){int A = 0; // 数字正确且位置正确的个数int B = 0; // 数字正确但位置不对的个数// 标记已经匹配的数字int answerUsed[4] = {0, 0, 0, 0};int guessUsed[4] = {0, 0, 0, 0};// 先计算A值for(int i = 0; i < 4; i++) {if(answer[i] == guess[i]) {A += 1;answerUsed[i] = 1;guessUsed[i] = 1;}}// 再计算B值for(int i = 0; i < 4; i++) {if(!guessUsed[i]) {for(int j = 0; j < 4; j++) {if(!answerUsed[j] && guess[i] == answer[j]) {B += 1;answerUsed[j] = 1;break;}}}}// 分配内存存储提示字符串char* hintStr = malloc(5 * sizeof(char));sprintf(hintStr, "%dA%dB", A, B);return hintStr;
}

九、C++算法源码

#include <bits/stdc++.h>
using namespace std;// 函数声明
string findPossibleAnswer(int n, vector<string> guesses, vector<string> hints);
string generateHint(string answer, string guess);int main(){int n;// 读取猜测次数Ncin >> n;// 初始化猜测和提示的向量vector<string> guesses(n);vector<string> hints(n);// 读取每一组猜测和提示for(int i = 0; i < n; i++) {cin >> guesses[i] >> hints[i];}// 查找可能的谜底string result = findPossibleAnswer(n, guesses, hints);// 输出结果cout << result << "\n";return 0;
}// 定义查找可能谜底的函数
string findPossibleAnswer(int n, vector<string> guesses, vector<string> hints){string possibleAnswer = "";bool multiple = false;// 遍历所有可能的四位数字for(int i = 0; i <= 9999; i++) {// 将数字格式化为四位字符串string currentGuess = to_string(i);while(currentGuess.length() < 4) currentGuess = "0" + currentGuess;bool isValid = true;// 验证当前数字是否符合所有提示for(int j = 0; j < n; j++) {// 生成当前猜测与谜底的提示string hint = generateHint(currentGuess, guesses[j]);// 如果提示不匹配,则当前数字不符合if(hint != hints[j]) {isValid = false;break;}}// 如果当前数字符合所有提示if(isValid){if(possibleAnswer.empty()) {possibleAnswer = currentGuess;}else {// 如果已经有一个符合的谜底,则不唯一,返回"NA"return "NA";}}}// 返回唯一的谜底或"NA"return possibleAnswer.empty() ? "NA" : possibleAnswer;
}// 定义生成提示的函数
string generateHint(string answer, string guess){int A = 0; // 数字正确且位置正确的个数int B = 0; // 数字正确但位置不对的个数// 标记已经匹配的数字vector<bool> answerUsed(4, false);vector<bool> guessUsed(4, false);// 先计算A值for(int i = 0; i < 4; i++) {if(answer[i] == guess[i]) {A += 1;answerUsed[i] = true;guessUsed[i] = true;}}// 再计算B值for(int i = 0; i < 4; i++) {if(!guessUsed[i]) {for(int j = 0; j < 4; j++) {if(!answerUsed[j] && guess[i] == answer[j]) {B += 1;answerUsed[j] = true;break;}}}}// 返回提示字符串return to_string(A) + "A" + to_string(B) + "B";
}

🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

相关文章:

华为OD机试 - 猜数字 - 暴力枚举(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…...

Flink触发器Trigger

前言 在 Flink 窗口计算模型中&#xff0c;数据先经过 WindowAssigner 分配窗口&#xff0c;然后再经过触发器 Trigger&#xff0c;Trigger 决定了一个窗口何时被 ProcessFunction 处理。每个 WindowAssigner 都有一个默认的 Trigger&#xff0c;如果默认的不满足需求&#xf…...

【操作系统的使用】Linux 系统环境变量与服务管理:设置与控制的艺术

文章目录 系统环境变量与服务管理&#xff1a;设置与控制的艺术一、系统环境变量的设置1.1 临时设置环境变量1.2 永久设置环境变量 二、服务启动类型的设置2.1 查看服务状态2.2 启动和停止服务2.3 设置服务的启动类型2.3.1 设置服务在启动时运行2.3.2 禁用服务在启动时运行2.3.…...

速盾:高防cdn配置中性能优化是什么?

高防CDN配置中的性能优化是指通过调整CDN配置以提升网站的加载速度、响应时间和用户体验。在进行性能优化时&#xff0c;需要考虑多个因素&#xff0c;包括CDN节点的选择和布置、缓存策略、缓存过期时间、预取和预加载、并发连接数和网络延迟等。 首先&#xff0c;CDN节点的选…...

Qt_软件添加版本信息

文章内容: 给生成的软件添加软件的版权等信息 #include <windows.h> //中文的话增加下面这一行 #pragma code_page(65001)VS_VERSION_INFO VERSIONINFO...

mallocfree和newdelete的区别

malloc\free和new\delete的区别 malloc/free new/delete 身份&#xff1a; 函数 运算符\关键字 返回值&#xff1a; void* 带类型的指针 参数&#xff1a; 字节个数(手动计算) 类型 自动计算字节数 处理数组&#xff1a; 手动计算数组总字节数 new 类型[数量] 扩容&#xff1…...

无锁队列实现(Michael Scott),伪代码与c++实现

一、Michael & Scoot 原版伪代码实现 structure pointer_t {ptr: pointer to node_t, count: unsigned integer}structure node_t {value: data type, next: pointer_t}structure queue_t {Head: pointer_t, Tail: pointer_t}initialize(Q: pointer to queue_t)node new_…...

猜数字小游戏

前言 猜数字游戏是一款经典且简单的互动游戏&#xff0c;常常用于提高逻辑思维能力和锻炼数学技巧。本文将深入探讨一段用 JavaScript 编写的猜数字游戏代码&#xff0c;帮助读者理解游戏的基本逻辑和实现方法。这段代码不仅适合初学者练习编程技巧&#xff0c;也是了解用户交…...

在Windows上搭建ChatTTS:从本地部署到远程AI音频生成全攻略

文章目录 前言1. 下载运行ChatTTS模型2. 安装Cpolar工具3. 实现公网访问4. 配置ChatTTS固定公网地址 前言 本篇文章主要介绍如何快速地在Windows系统电脑中本地部署ChatTTS开源文本转语音项目&#xff0c;并且我们还可以结合Cpolar内网穿透工具创建公网地址&#xff0c;随时随…...

如何用好 CloudFlare 的速率限制防御攻击

最近也不知道咋回事儿,群里好多站长都反映被CC 攻击了。有人说依旧是 PCDN 干的,但明月感觉不像,因为有几个站长被 CC 攻击都是各种动态请求(这里的动态请求指的是.php 文件的请求)。经常被攻击的站长们都知道,WordPress /Typecho 这类动态博客系统最怕的就是这种动态请求…...

Unity3D 立方体纹理与自制天空盒详解

立方体纹理和自制天空盒是游戏开发中常用的技术之一&#xff0c;可以为游戏增添更加丰富的视觉效果。在本文中&#xff0c;我们将详细介绍Unity3D中立方体纹理和自制天空盒的使用方法&#xff0c;并给出相应的代码实现。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff…...

【工具】VSCODE下载,配置初次设置

打开 settings.json 文件&#xff0c;包含了 Visual Studio Code (VSCode) 中的各种用户配置。 {"files.associations": {"*.vue": "vue","*.wpy": "vue","*.wxml": "html","*.wxss": "…...

vue使用jquery的ajax,页面跳转

一、引入jquery依赖 打开终端更新npm npm install -g npm 更新完后引入输入npm install jquery 加载完后 在最外层的package.json文件中加入以下代码 配置好后导入jquery 设置变量用于接收服务器传输的数据 定义ajax申请数据 服务器的Controller层传输数据 &#xff08;…...

基于微信小程序的社区二手交易系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…...

D34【python 接口自动化学习】- python基础之输入输出与文件操作

day34 文件关闭 学习日期&#xff1a;20241011 学习目标&#xff1a;输入输出与文件操作&#xfe63;-46 常见常新&#xff1a;文件的关闭 学习笔记&#xff1a; 文件关闭的内部工作过程 close&#xff08;&#xff09;函数 with语句 常用的打开关闭文件 # 文件关闭 # 方式…...

【Linux系列】set -euo pipefail 命令详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【Python爬虫实战】正则:中文匹配与贪婪非贪婪模式详解

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、匹配中文 &#xff08;一&#xff09;匹配单个中文字符 &#xff08;二…...

保护数据安全:JS前端加密与PHP后端解密实战教程,让敏感信息更安全

保护数据安全&#xff1a;JS前端加密与PHP后端解密实战教程&#xff0c;让敏感信息更安全 在Web开发中&#xff0c;确保用户提交的敏感信息&#xff08;如密码、手机号码等&#xff09;的安全性是非常重要的。一种常见的做法是使用加密技术来保护这些数据&#xff0c;在传输过…...

72 分布式锁

72 分布式锁 什么是分布式锁 分布式锁 分布式 锁。那么分布式是指的什么呢&#xff1f;锁又是锁的谁呢&#xff1f;在业务开发中我们经常会听到分布式分布式的概念&#xff0c;分布式也很简单&#xff0c;通俗的来说就是你具有多个服务器&#xff0c;每个服务器上运行的程序…...

使用Windbg分析dump文件排查C++软件异常的一般步骤与要点分享

目录 1、概述 2、打开dump文件&#xff0c;查看发生异常的异常类型码 3、查看发生异常的那条汇编指令 3.1、汇编代码能最直接、最本真的反映出崩溃的原因 3.2、汇编指令中访问64KB小地址内存区&#xff0c;可能是访问了空指针 3.3、汇编指令中访问了很大的内核态的内存地…...

30 天 Python 3 学习计划

30 天 Python 3 学习计划 https://www.runoob.com/python3/python3-tutorial.html 1. Python3 基础语法 2. Python3 基本数据类型 3. Python3 数据类型转换 4. Python3 解释器 5. Python3 注释 6. Python3 运算符 7. Python3 数字(Number) 8. Python3 字符串 …...

【MATLAB实例】批量提取.csv数据并根据变量名筛选

【MATLAB实例】批量提取.csv数据并根据变量名筛选 准备&#xff1a;数据说明MATLAB批量提取参考 准备&#xff1a;数据说明 .csv数据如下&#xff1a; 打开某表格数据&#xff0c;如下&#xff1a;&#xff08;需要说明的是此数据含表头&#xff09; 需求说明&#xff1a;需…...

【软件】Ubuntu下QT的安装和使用

【软件】Ubuntu下QT的安装和使用 零、前言 QT是应用得比较广泛的程序框架&#xff0c;是因为其跨平台特性比较好&#xff0c;且用C/C作为开发语言&#xff0c;性能也比较好&#xff0c;故本文介绍如何安装和使用QT&#xff0c;用的版本是QT 6.2.4&#xff0c;由于QT在Windows…...

在Spring Boot中具有多个实现的接口正确注入的六种方式

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在Spring Boot中&#xff0c;当一个接口具有多个实现时&#xff0c;正确地将这些实现注入到需要使用它们的地方是一个常见的需求。以下是在Spring Boot中实现这一目标的六种方式&#xff1a; 1. 使用Autowir…...

登陆微软账户太慢了,如何解决

软账号登录慢解决办法&#xff1a; 打开“网络和Internet”选择“以太网”选择“更改适配器选项”选择现用网络&#xff0c;右键->属性选择“IPV4”右键属性更改DNS地址为以下两者4.2.2.14.2.2.2...

Vue3动态组件component不生效问题解决方法

问题&#xff1a; vue3循环渲染动态组件component不生效&#xff0c;页面空白 在vue3使用component动态组件展示组件时&#xff0c;组件就是不展示显示空白。在vue2中使用动态变量component展示组件都是没问题。试了很多方法 踩了很多坑&#xff0c;所以记录下&#xff1a; 登录…...

算力基础篇:从零开始了解算力

什么是算力 算力即计算能力&#xff08;Computing Power&#xff09;&#xff0c;狭义上指对数字问题的运算能力&#xff0c;而广义上指对输入信息处理后实现结果输出的一种能力。虽然处理的内容不同&#xff0c;但处理过程的能力都可抽象为算力。比如人类大脑、手机以及各类服…...

Redis 万字入门教程

0. 前言 文章已经收录到 GitHub 个人博客项目&#xff0c;欢迎 Star&#xff1a; https://github.com/chenyl8848/chenyl8848.github.io或者访问网站&#xff0c;进行在线浏览&#xff1a; https://chenyl8848.github.io/1. NoSQL 1.1 NoSQL 介绍 NoSQL(Not Only SQL )&…...

LeetCode :LCR 173. 点名

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;leetcode刷题 ​ ​ LeetCode :LCR 173. 点名 这个题就是缺失的数字&#xff0c;我们可以通过三种方式来解决这个问题。 1.可以通过位异或的方式来找到这个数&#xff08;相同的数异或为…...

Gin框架操作指南06:POST绑定(下)

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;没用过Gin的读者强烈建议先阅读第一节&#xff1a;Gin操作指南&#xff1a;开山篇。 本节继续演示POST绑定&#xff0c;包括将request-body绑定到不同的结构体中&#x…...