洛谷 1092 虫食算 (dfs+剪枝)

题解:洛谷 P1092 [NOIP 2004 提高组] 虫食算 题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的数字。个不同的字母分别代表的数字,使得该加法算式成立。第二到第四行,每行有一个由大写字母组成的字符串,分别代表两个加数以及和。上面的算式是一个4进制的算式。你的任务是,对于给定的。 阅读详情
题目描述

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

43#9865#045
+ 8468#6633
44445509678

其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5。

现在,我们对问题做两个限制:

首先,我们只考虑加法的虫食算。这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0。

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

BADC
+CBDA
DCCC

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

输入输出格式

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

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

输入输出样例

输入样例#1:
5
ABCED
BDACE
EBBAA
输出样例#1:
1 0 3 4 2

说明

对于30%的数据,保证有N<=10;

对于50%的数据,保证有N<=15;

对于全部的数据,保证有N<=26。

dfs+剪枝

刚开始搜时一定要从右往左搜,不然会T,虽然看起来没有什么道理,但正解都是这么搜的QAQ。。

代码
#include<iostream> 
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;

int N,f,m,cnt=-1;
char A[30],B[30],C[30];
int a[30],num[4][30],used[30],pos[30],Unsigned[30];

bool print()
{
    int b,k=0;
    for(int i=N;i>=1;--i)
    {
        b=a[num[1][i]]+a[num[2][i]]+k,k=b/N,b%=N;   //判断答案是否正确 
        if(a[num[3][i]]!=b) return false;
    }
    return true;
}
void Done(int n)
{
     if(f) return ;
     if(a[num[1][0]]+a[num[2][0]]>=N) return ;  // 最高位不进位 
     if(n==N) 
       if(print())
       {
          for(int i=1;i<=N;++i) 
             cout<<a[i]<<" ";
           f=1; return ;
       }
       else return ;
      for(int i=1;i<=N;++i)  
      {
          m=1;
          if(i==N) m=0;
          if(a[num[1][i]]!=-1&&a[num[2][i]]!=-1&&a[num[3][i]]!=-1)   //判断已经搜到的答案的合法性  重要的剪枝1 !!! 
             if(a[num[3][i]]!=(a[num[1][i]]+a[num[2][i]])%N&&a[num[3][i]]!=((a[num[1][i]]+a[num[2][i]]+m)%N))
              return ;
          if(a[num[1][i]]!=-1&&a[num[3][i]]!=-1&&a[num[2][i]]==-1)
             if(used[(a[num[3][i]]-a[num[1][i]]+N)%N]&&used[(a[num[3][i]]-a[num[1][i]]-1+N)%N])
               return ;
          if(a[num[2][i]]!=-1&&a[num[3][i]]!=-1&&a[num[1][i]]==-1)
             if(used[(a[num[3][i]]-a[num[2][i]]+N)%N]&&used[(a[num[3][i]]-a[num[2][i]]-1+N)%N])
               return ;
          if(a[num[1][i]]!=-1&&a[num[2][i]]!=-1&&a[num[3][i]]==-1)
             if(used[(a[num[1][i]]+a[num[2][i]])%N]&&used[(a[num[1][i]]+a[num[2][i]]+m)%N])
               return ;

      } 
     for(int i=N-1;i>=0;--i)
     {
       if(!used[i]&&!f) //不重复放置 
       {
           a[pos[n]+1]=i;
           used[i]=1;
           Done(n+1);
           a[pos[n]+1]=-1;
           used[i]=0;
       }
     }
}
int main()
{
    scanf("%d",&N);
    memset(a,-1,sizeof(a));
    cin>>A>>B>>C;
    for(int j=N-1;j>=0;--j)
    {
        num[1][j+1]=A[j]-'A'+1,num[2][j+1]=B[j]-'A'+1,num[3][j+1]=C[j]-'A'+1;  // 按照字母的出现顺序枚举            
        if(!Unsigned[A[j]-'A'])//从右往左,从上往下,答案的递减可能性最大,可以优先剪去一些不必要的废枝,  重要的剪枝2 !!! 
        {
            Unsigned[A[j]-'A']=1;
            pos[++cnt]=A[j]-'A';
        }
        if(!Unsigned[B[j]-'A'])
        {
            Unsigned[B[j]-'A']=1;
            pos[++cnt]=B[j]-'A';
        }
        if(!Unsigned[C[j]-'A'])
        {
            Unsigned[C[j]-'A']=1;
            pos[++cnt]=C[j]-'A';
        }       
    }
    Done(0);
    return 0;
} 
BGE-Reranker-v2-M3介绍 重排序模型介绍 阅读详情

相关推荐

电子发票二维码背后的秘密:10分钟看懂校验码、加密字符含义与防伪设计

本文深入解析电子发票二维码的结构与防伪设计,揭示校验码和加密字符的生成原理及验证方法。通过实际案例和技术细节,帮助财务人员理解电子发票的安全机制,提升防伪识别能力,确保税务合规。

weixin_29248611的博客 530

【搜索】【NOIP2004提高组】四、虫食算

四、虫食算(alpha.pas/dpr/c/cpp)【问题描述】所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子: 43#9865#045+8468#6633 44445506978其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二...

diying4157的博客 510

SIwave仿真手册——软件基础(一)

最近在学习SIWAVE,在这里将自己的笔记整理一下,做一个专题。希望对大家有帮助,这个会持续更新的。仅限于软件操作学习,不涉及信号完整性的讨论。

luohuo9844的博客 4万+

python练习题5(能用就行系列)——题源菜鸟教程

21.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。22.两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。24.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

weixin_46640300的博客 372

TSMaster MBD模块实战:如何用Simulink模型快速搭建汽车电子测试环境

本文实战演示了如何利用TSMaster的MBD模块,将Simulink模型快速部署为汽车电子自动化测试环境的核心。通过建立模型与TSMaster系统变量的实时数据通道,并利用数据仓库统一数据定义,工程师能无缝连接算法仿真与真实总线网络,显著提升从模型到HIL测试的验证效率。

php55的博客 207

Calibre LVS效率翻倍秘籍:用Hierarchical Flow处理亿级晶体管设计的5个关键阶段

本文详细解析了如何利用Hierarchical Flow技术提升Calibre LVS在亿级晶体管SoC设计中的验证效率。通过五个关键阶段的分层验证流程,包括顶层抽象验证、模块级独立验证等,可显著降低内存占用40-60%,缩短迭代周期50-70%,特别适用于SMIC等先进工艺节点。文章还分享了算力资源优化、并行化处理等实战技巧,帮助工程师应对大规模芯片验证挑战。

sam99的博客 768

[NOIP2004 提高组] 虫食算

其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是 nn 进制的,我们就取英文字母表的前 nn 个大写字母来表示这个算式中的 00 到 n - 1n−1 这 nn 个不同的数字:但是这 nn 个字母并不一定顺序地代表 00 到 n-1n−1。你的任务是,对于给定的 nn 进制加法算式,求出 nn 个不同的字母分别代表的数字,使得该加法算式成立。这里的加法是 nn 进制加法,算式中三个数都有 nn 位,允许有前导的 00。

NDCSID的博客 1203

【ARMv8 异常模型入门及渐进7 - GIC及安全中断介绍】

GIC-v3中,引入了支持2种安全状态(secure state),也就是对于中断,根据secure状态,分为安全中断和非安全中断。当然也可以只支持一种安全状态。这里的2种安全状态和1种安全状态,主要是影响中断分组,所使用IRQ和FIQ管脚的映射,以及gic中的寄存器访问。

CodingCos的博客 2116

noip2004虫食算--搜索

链接:https://www.luogu.org/problemnew/show/P1092 首先这题标算据说是高斯消元,但标签已经是搜索了。。。身为蒟蒻当然只会打搜索。而我的搜索又打的很翔,从右到左dfs搜过来,暴枚这一列三个数的情况,然后进位。注意枚举从大到小枚,因为第一位(最左边)不会进位,所以从右到左时从大到小会更好,不然会被卡tle一个点。。。 // luogu-judger-en...

caoyang1123的博客 336

核心组件大换血:Backbone与Neck魔改篇:YOLO26魔改Neck:引入BiFPN(双向特征金字塔),多尺度融合能力飙升

本文深入解析了YOLO26目标检测模型中Neck部分的优化策略,重点探讨了BiFPN(双向特征金字塔网络)的原理与实现。文章首先指出YOLO26原生FPN+PAN结构在多尺度特征融合上的局限性,特别是在小目标检测和边缘部署场景中的性能瓶颈。随后系统梳理了Neck网络的演进历程,从FPN、PANet到BiFPN和ASFF,详细对比了各架构的特点。核心部分展示了如何将BiFPN引入YOLO26,包括可学习权重融合、双向跨尺度连接等关键技术实现,并提供了PyTorch代码示例。本文为需要提升小目标检测性能或优化边

ZDQ58818的博客 246

windows11下pycharm怎么完全卸载?完整卸载pycharm编辑器的教程

在卸载pycharm时都有遇到卸载不干净不完全的问题,那么具体怎样做才能完全卸载pycharm呢?退出所有的操作,重新启动电脑,会发现相关的软件已经被删除了。步骤1:卸载软件并删除安装目录。步骤2:删除相关的注册表。

拥抱具身智能,昇腾Ascend C 1万+

洛谷 P1092 [NOIP2004 提高组] 虫食算

洛谷 P1092 [NOIP2004 提高组] 虫食算

xtys4574274584的博客 1273

YOLOv8+SAM强强联合:用分割“喂“检测,复杂背景下作物AP从72%干到77.7%,杂草误检降60%

目标与背景高度相似:如农业(作物vs杂草)、工业(零件vs台面)、医学(病灶vs正常组织);遮挡严重的场景:如密集人群(人被遮挡)、森林(树木被枝叶遮挡);小目标密集场景:如无人机航拍(远处小目标易混背景)。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 793

洛谷P1092 虫食算【DFS+剪枝】

https://www.luogu.org/problemnew/show/P1092 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子: http://paste.ubuntu.com/25448822/ 其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5。 现在...

Irish_Moonshine的博客 583

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

洛谷P1092虫食算

洛谷P1092虫食算 标签:搜索、数论、数学 #include<iostream> #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; int n,c[4][30],v[30],a[30]; void dfs(int x,int y,int t){ if (a[c[1][n]]>=0&&a[c[2][n]]>=0&&

AEliauk的博客 213

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

洛谷P1092 [NOIP 2004 提高组] 虫食算

其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的数字。看到这个题目的第一眼就想到直接暴力枚举每一个字母所对应的数字,时间复杂度不高,也就。个不同的字母分别代表的数字,使得该加法算式成立。第二到第四行,每行有一个由大写字母组成的字符串,分别代表两个加数以及和。函数没打了,思考我们已知部分的字母所对应的数字,该如何尽可能排除错误呢?),判断是否满足即可。

yjfyjfyjf54188的博客 771

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

洛谷P1092 虫食算

搜索+剪枝(码农题)

a free man 594

洛谷 P1092 虫食算

P1092 虫食算 算法:爆搜+剪枝 启发: 1.代码结构要清晰,便于调试 80分代码 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN=32; int n,exp[4][MAXN],val[MAXN],flag,used[MAXN]...

weixin_30526593的博客 100

洛谷—— P1092 虫食算

https://www.luogu.org/problem/show?pid=1092 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子: http://paste.ubuntu.com/25448822/ 其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5...

agcozdwdfvds08078的博客 111

洛谷 P1092 虫食算 dfs优化 (尚贤)

题目: https://www.luogu.com.cn/problem/P1092 **爸爸的话:**孩子第一次做 提高/省选 的题目,在3个多小时的坚持下,还是80分,不过孩子没有崩溃,还打算用算法宝典里面另外一个思路从零开始,努力和心态都很值得点赞。 最后在老师的点拨下,找到AC的办法,从80到100分,是需要靠幸运,也是一个经验和经历。 记录这一刻。 孩子的AC代码,注意第十九行,之...

广东省清远市博爱学校—尚贤的博客 433

[NOIP2004] 提高组 洛谷P1092 虫食算

题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5。 现在,我们对问题做两个限制: 首先,我们只考虑加法的虫食算。这里的加法...

dezhen7015的博客 225

洛谷 P1092 虫食算(dfs)

题目传送 这题的官方题解是高斯消元,可是本蒟蒻不会。。。 讲一下深搜的方法: 1.搜索从第一位的值开始搜,直到最后一位,判断是否合法。 2.注意剪枝防TLE。 3.三个数都是n位,最高位不能有进位。 #include <iostream> #include <cstring> #include <cstdlib> using namespace std; con...

Crush_Z 239

[FT][10+]NOIP 2004 虫食算

搜索枚举

我要吃熊猫 444

luogu1092:虫吃算:深搜+剪枝

题目连接:该题是luogu试炼场的2-7:T6 题目大意: 1给出一个3*n的字母棋盘,要求用[0,n)这n个数字替换棋盘里的字母,使得棋盘形成一个n进制的合法的竖式。 解题思路:经典的深搜复杂题,NOIP2004的T4 1按照位置搜索,N的最大之是26,所以会超时; 2想剪枝:进位的处理,数字的差重。 3玄学:枚举的时候从大到小会优化很多时间。 上代码: //luogu1...

liusu201601的博客 311

[题解]洛谷P1092 虫食算

原题:   P1092 思路:   我太弱了,竟然打了一个上午。。。。。。   一开始我竟然想从A到B枚举每一种排列最后检查。。。很显然这种方法效率特别低——O(N!)   于是想到了由低位到高位,由两个加数上的位到和上的位,逐个枚举数字。当然如果不剪枝的话就和第一种方法没什么区别    剪枝: 剪枝一:  这个剪枝比较好想,在每枚举完一列时(或者该列上的数字已被枚举了),...

weixin_30481087的博客 145
上一篇: 洛谷 1378 油滴扩展
下一篇: 洛谷 1311 选择客栈
Loi_Mapleleaf
博客等级 码龄10年 17粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值