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

【NOIP提高组】虫食算

【NOIP提高组】虫食算

      • C语言
      • C++


💐The Begin💐点点关注,收藏不迷路💐

所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子:

43#9865#045
+8468#6633
= 44445506678
其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5。
现在,我们对问题做两个限制:

首先,我们只考虑加法的虫食算。这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0。
其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是N进制的,我们就取英文字母表午的前N个大写字母来表示这个算式中的0到N-1这N个不同的数字:但是这N个字母并不一定顺序地代表0到N-1)。输入数据保证N个字母分别至少出现一次。
BADC
+CRDA
= DCCC

上面的算式是一个4进制的算式。很显然,我们只要让ABCD分别代表0123,便可以让这个式子成立了。你的任务是,对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立,输入数据保证有且仅有一组解。

输入
输入包含4行。第一行有一个正整数N(N<=26),后面的3行每行有一个由大写字母组成的字符串,分别代表两个加数以及和。这3个字符串左右两端都没有空格,从高位到低位,并且恰好有N位。

输出

输出包含一行。在这一行中,应当包含唯一的那组解。解是这样表示的:输出N个数字,分别表示A,B,C……所代表的数字,相邻的两个数字用一个空格隔开,不能有多余的空格。

样例输入

5
ABCED
BDACE
EBBAA

样例输出

1 0 3 4 2

提示

【数据规模】
对于30%的数据,保证有N<=10;
对于50%的数据,保证有N<=15;
对于全部的数据,保证有N<=26。

C语言

#include <stdio.h>
#include <string.h>// 最大可能的字符数,可根据实际情况调整
#define MAX_CHARS 30  int numDigits;  // 存储进制数N,简称numDigits
char addends[4][MAX_CHARS];  // 存储算式的三个数(两个加数与和),简称addends数组
int usedDigits[MAX_CHARS];  // 标记数字是否已被使用,简称usedDigits数组
int digitMapping[MAX_CHARS];  // 存储字母到数字的映射,简称digitMapping数组
int solutionFound;  // 标记是否已找到解,简称solutionFound// 将字符转换为对应的索引(A对应0,B对应1,以此类推)
int charToIndex(char c) {return c - 'A';
}// 递归搜索可能的字母到数字的映射,以找到满足算式的解
void searchMapping(int row, int col, int carry) {int i;// 如果已经找到解,直接返回if (solutionFound == 1) {return;}// 如果已经处理完所有列(从高位到低位)if (col == -1) {// 如果进位为0,说明找到了满足算式的解if (carry == 0) {for (i = 0; i < numDigits; i++) {printf("%d ", digitMapping[i]);}solutionFound = 1;}return;}// 检查当前列的各位数字是否满足加法规则(考虑进位)for (i = col; i >= 0; i--) {int digit1 = digitMapping[charToIndex(addends[1][i])];int digit2 = digitMapping[charToIndex(addends[2][i])];int digit3 = digitMapping[charToIndex(addends[3][i])];if (digit1 == -1 || digit2 == -1 || digit3 == -1) {continue;}if ((digit1 + digit2) % numDigits!= digit3 && (digit1 + digit2 + 1) % numDigits!= digit3) {return;}}// 如果当前位置的字母还没有映射到数字if (digitMapping[charToIndex(addends[row][col])] == -1) {for (i = numDigits - 1; i >= 0; i--) {if (!usedDigits[i]) {// 如果不是处理和的那一行if (row!= 3) {digitMapping[charToIndex(addends[row][col])] = i;usedDigits[i] = 1;searchMapping(row + 1, col, carry);digitMapping[charToIndex(addends[row][col])] = -1;usedDigits[i] = 0;} else {int sum = digitMapping[charToIndex(addends[1][col])] + digitMapping[charToIndex(addends[2][col])] + carry;if (sum % numDigits!= i) {continue;}usedDigits[i] = 1;digitMapping[charToIndex(addends[row][col])] = i;searchMapping(1, col - 1, sum / numDigits);usedDigits[i] = 0;digitMapping[charToIndex(addends[row][col])] = -1;}}}} else {// 如果当前位置的字母已经有映射if (row!= 3) {searchMapping(row + 1, col, carry);} else {int sum = digitMapping[charToIndex(addends[1][col])] + digitMapping[charToIndex(addends[2][col])] + carry;if (sum % numDigits!= digitMapping[charToIndex(addends[3][col])]) {return;}searchMapping(1, col - 1, sum / numDigits);}}
}int main() {// 读取进制数Nscanf("%d", &numDigits);// 读取算式的三个数scanf("%s%s%s", addends[1], addends[2], addends[3]);// 初始化数字映射数组为 -1,表示未映射memset(digitMapping, -1, sizeof(int) * numDigits);// 初始化是否找到解的标记为0solutionFound = 0;// 开始搜索满足算式的字母到数字的映射searchMapping(1, numDigits - 1, 0);return 0;
}

C++

#include <iostream>
#include <string>
#include <cstring>// 最大可能的字符数,可根据实际情况调整
const int MAX_CHARS = 30;  int numDigits;  // 存储进制数N,简称numDigits
std::string addends[4];  // 存储算式的三个数(两个加数与和),简称addends数组
int usedDigits[MAX_CHARS];  // 标记数字是否已被使用,简称usedDigits数组
int digitMapping[MAX_CHARS];  // 存储字母到数字的映射,简称digitMapping数组
bool solutionFound;  // 标记是否已找到解,简称solutionFound// 将字符转换为对应的索引(A对应0,B对应1,以此类推)
int charToIndex(char c) {return c - 'A';
}// 递归搜索可能的字母到数字的映射,以找到满足算式的解
void searchMapping(int row, int col, int carry) {int i;// 如果已经找到解,直接返回if (solutionFound) {return;}// 如果已经处理完所有列(从高位到低位)if (col == -1) {// 如果进位为0,说明找到了满足算式的解if (carry == 0) {for (i = 0; i < numDigits; i++) {std::cout << digitMapping[i] << " ";}solutionFound = true;}return;}// 检查当前列的各位数字是否满足加法规则(考虑进位)for (i = col; i >= 0; i--) {int digit1 = digitMapping[charToIndex(addends[1][i])];int digit2 = digitMapping[charToIndex(addends[2][i])];int digit3 = digitMapping[charToIndex(addends[3][i])];if (digit1 == -1 || digit2 == -1 || digit3 == -1) {continue;}if ((digit1 + digit2) % numDigits!= digit3 && (digit1 + digit2 + 1) % numDigits!= digit3) {return;}}// 如果当前位置的字母还没有映射到数字if (digitMapping[charToIndex(addends[row][col])] == -1) {for (i = numDigits - 1; i >= 0; i--) {if (!usedDigits[i]) {// 如果不是处理和的那一行if (row!= 3) {digitMapping[charToIndex(addends[row][col])] = i;usedDigits[i] = 1;searchMapping(row + 1, col, carry);digitMapping[charToIndex(addends[row][col])] = -1;usedDigits[i] = 0;} else {int sum = digitMapping[charToIndex(addends[1][col])] + digitMapping[charToIndex(addends[2][col])] + carry;if (sum % numDigits!= i) {continue;}usedDigits[i] = 1;digitMapping[charToIndex(addends[row][col])] = i;searchMapping(1, col - 1, sum / numDigits);usedDigits[i] = 0;digitMapping[charToIndex(addends[row][col])] = -1;}}}} else {// 如果当前位置的字母已经有映射if (row!= 3) {searchMapping(row + 1, col, carry);} else {int sum = digitMapping[charToIndex(addends[1][col])] + digitMapping[charToIndex(addends[2][col])] + carry;if (sum % numDigits!= digitMapping[charToIndex(addends[3][col])]) {return;}searchMapping(1, col - 1, sum / numDigits);}}
}int main() {// 读取进制数Nstd::cin >> numDigits;// 读取算式的三个数for (int i = 1; i <= 3; i++) {std::cin >> addends[i];}// 初始化数字映射数组为 -1,表示未映射std::memset(digitMapping, -1, sizeof(int) * numDigits);// 初始化是否找到解的标记为falsesolutionFound = false;// 开始搜索满足算式的字母到数字的映射searchMapping(1, numDigits - 1, 0);return 0;
}

在这里插入图片描述


💐The End💐点点关注,收藏不迷路💐

相关文章:

【NOIP提高组】虫食算

【NOIP提高组】虫食算 C语言C &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 所谓虫食算&#xff0c;就是原先的算式中有一部分被虫子啃掉了&#xff0c;需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子&#xff1a; 43#98…...

软件测试面试题个人总结

前面看到了一些面试题&#xff0c;总感觉会用得到&#xff0c;但是看一遍又记不住&#xff0c;所以我把面试题都整合在一起&#xff0c;都是来自各路大佬的分享&#xff0c;为了方便以后自己需要的时候刷一刷&#xff0c;不用再到处找题&#xff0c;今天把自己整理的这些面试题…...

HTML 语法规范——代码注释、缩进与格式、标签与属性、字符编码等

文章目录 一、代码注释1.1 使用注释的主要目的1.2 使用建议二、标签的使用2.1 开始标签和结束标签2.2 自闭合标签2.3 标签的嵌套2.4 标签的有效性三、属性四、缩进与格式4.1 一致的缩进4.2 元素单独占用一行4.3 嵌套元素的缩进4.4 避免冗长的行五、字符编码六、小结在开发 HTML…...

【Wi-Fi】WiFi中QAM及16-QAM、64-QAM、512-QAM、1024-QAM、2048-QAM、4096-QAM整理

参考链接 什么是QAM&#xff1f;QAM是如何工作的&#xff1f; - 华为 不同阶QAM调制星座图中&#xff0c;符号能量的归一化计算原理 - 知乎 16 QAM modulation vs 64 QAM modulation vs 256 QAM modulation 512 QAM vs 1024 QAM vs 2048 QAM vs 4096 QAM modulation type…...

红黑树的平衡之舞:数据结构中的优雅艺术

文章目录 前言&#x1f680;一、红黑树的介绍1.1 红黑树的概念1.2 红黑树的特点1.3 红黑树的性质 &#x1f680;二、红黑树结点的定义&#x1f680;三、红黑树的框架&#x1f680;四、旋转操作&#x1f680;五、红黑树的插入操作5.1 uncle结点存在且为红5.2 uncle结点不存在或者…...

angular实现list列表和翻页效果

说明&#xff1a;angular实现list列表和翻页效果 上一页 当前页面 下一页 效果图&#xff1a; step1: E:\projectgood\ajnine\untitled4\src\app\car\car.component.css .example-form-fields {display: flex;align-items: flex-start; }mat-list-item{background: antiquew…...

闯关leetcode——3285. Find Indices of Stable Mountains

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/find-indices-of-stable-mountains/description/ 内容 There are n mountains in a row, and each mountain has a height. You are given an integer array height where height[i] represents t…...

算法【Java】—— 动态规划之斐波那契数列模型

动态规划 动态规划的思路一共有五个步骤&#xff1a; 状态表示&#xff1a;由经验和题目要求得出&#xff0c;这个确实有点抽象&#xff0c;下面的题目会带大家慢慢感受状态标识状态转移方程初始化&#xff1a;避免越界访问 dp 表&#xff0c;所以在进行填表之前我们要预先填…...

idea连接docker并构建镜像

安装docker 安装docker idea连接docker 安装docker插件 设置docker连接 设置docker.exe 这个docker.exe是为了运行docker&#xff0c;可以通过安装docker desktop获取 docker desktop下载地址 右键图标找到文件位置 在同级的resource中 编写Dockerfile # 使用官方 Nginx…...

百度如何打造AI原生研发新范式?

&#x1f449;点击即可下载《百度AI原生研发新范式实践》资料 2024年10月23-25日&#xff0c;2024 NJSD技术盛典暨第十届NJSD软件开发者大会、第八届IAS互联网架构大会在南京召开。本届大会邀请了工业界和学术界的专家&#xff0c;优秀的工程师和产品经理&#xff0c;以及其它行…...

RedisTemplate类中的常用方法粗解(简单明了,预计5分钟看完)

在阅读项目代码过程中发现引用RedisTemplate 的方法操作redis时&#xff0c;都会有一些特定的ops &#xff0c;对此好奇就查资料的情况下有了本博客。 操作之前付一张我们项目中的用到的地方的图 另外本文中的语言用到的是Java&#xff0c;附上试验用到的redisTemplete依赖 <…...

鸿蒙ArkTS中的布局容器组件(Column、Row、Flex、 Stack、Grid)

在鸿蒙ArkTS中&#xff0c;布局容器组件有很多&#xff0c;常见的有&#xff1a;   ⑴ Column&#xff1a;&#xff08;垂直布局容器&#xff09;&#xff1a;用于将子组件垂直排列。   ⑵ Row&#xff1a;&#xff08;水平布局容器&#xff09;&#xff1a;用于将子组件水…...

显存占用 显存测试

目录 显存测试 显存占用示例 一个模型多卡占用 显存测试 import torch# 计算张量的大小&#xff08;例如&#xff1a;每个 float 占用 4 字节&#xff09; # 40GB 40 * 1024 * 1024 * 1024 字节 # 每个 float 4 字节&#xff0c;因此需要的 float 数量为 (40 * 1024 * 1024…...

快速入门CSS

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 目录 CSS css的三种引入方式 css书写规范 选择器分类 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 color颜色设置 border边框设置 width/heigth 内/外边距 C…...

AcWing 1073 树的中心 树形dp (详解)

这道题目非常有新意&#xff0c;在过去&#xff0c;我们通常先访问子节点去更新父节点的状态&#xff0c;但是这道题我们还需要从父节点去更新子节点。 我们可以想象为向上和向下两个方向&#xff0c;我们任取一点&#xff0c;先向下走&#xff0c;再回来更新上面的点&#xf…...

modelscope下载Qwen2.5 72B 模型方法

conda create -n modelscope python=3.10 conda activate modelscopepip install modelscope执行这个python代码: from modelscope.hub.snapshot_download import snapshot_download# 下载模型到当前路径 model_dir = snapshot_download(...

重学SpringBoot3-整合 Elasticsearch 8.x (二)使用Repository

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 整合 Elasticsearch 8.x &#xff08;二&#xff09;使用Repository 1. 环境准备1.1 项目依赖1.2 Elasticsearch 配置 2. 使用Repository的基本步骤2.1 创建实体类2.2 创…...

为什么说模拟电路的难点就在开通过程和关断过程?难在什么地方?

模拟电路中开通过程和关断过程之所以困难&#xff0c;主要有以下几个方面的原因&#xff1a; 1. 瞬态响应特性复杂 - 在开通和关断瞬间&#xff0c;电路中的电流和电压会发生快速变化&#xff0c;产生复杂的瞬态响应。这些瞬态响应可能包含过冲、下冲、振铃等现象&#xff0c;…...

CubeIDE BUG-project‘hello‘has no explict encoding set hello

projecthellohas no explict encoding set hello 解决方法&#xff1a; 点击红色处注册账号后登录&#xff0c;删除原本文件后重新生成即可。...

在线PDF转图片网站

https://www.ilovepdf.com/download/qgxkmbzgxt6yb3s8l9f7fc3q9606hq0bfh4b33mnrf3p7tp8l0d4qy386b5dxqwjbhq7j3j4tp20m4dnb89wA9jjw25br1gtAw42l0m1sq047nvld4qqrm8kzjplkAhw9458p4wjgbmn08g49l23c1khsggdx4A7z3m9xh19mgzdlllyA6r1/52 在线excel转图片 https://www.zamzar.c…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

Java设计模式:责任链模式

一、什么是责任链模式&#xff1f; 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 是一种 行为型设计模式&#xff0c;它通过将请求沿着一条处理链传递&#xff0c;直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者&#xff0c;…...