【搜索】\(P1092\)虫食算

题目链接

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

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

输入格式

包含四行。
第一行有一个正整数\(N(N \leq 26)\)。

后面的三行,每行有一个由大写字母组成的字符串,分别代表两个加数以及和。这3个字符串左右两端都没有空格,从高位到低位,并且恰好有N位。

输出格式

一行,即唯一的那组解。

解是这样表示的:输出N个数字,分别表示A,B,C,…所代表的数字,相邻的两个数字用一个空格隔开,不能有多余的空格。

对于30%的数据,保证有\(N \leq 10\);

对于50%的数据,保证有\(N \leq 15\);

对于全部的数据,保证有\(N \leq 26\)。

Solution

搜索是比较好想的。但若直接枚举全排列需要n!,那么需要剪枝。

考虑加法,进位的话只会进1,所以如果(A + B) % n != C && (A + B +1) % n != C,显然不合法。然后因为三个数都是N位,所以最高位不可能进位。

那么什么搜索顺序会更优呢?从右往左,也就是从低位到高位。从右往左,按照字母出现顺序搜索,能在很大程度上提高剪枝效率。

最后,最关键的一点,是一个exit(0)的应用。第一次知道这到底是个什么。

exit(0):正常运行程序并退出程序。 exit 是一个函数。 exit是系统调用级别的,它表示了一个进程的结束。 exit是进程的退出。 exit是操作系统提供的(或者函数库中给出的)。 exit函数是退出应用程序,删除进程使用的内存空间,并将应用程序的一个状态返回给OS,这个状态标识了应用程序的一些运行信息,这个信息和机器和操作系统有关,一般是 0 为正常退出,非0 为非正常退出。 6. 非主函数中调用return和exit效果很明显,但是在main函数中调用return和exit的现象就很模糊,多数情况下现象都是一致的。

#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
long long read(){long long x = 0; int f = 0; char c = getchar();while(c < '0' || c > '9') f |= c == '-', c = getchar();while(c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();return f? -x:x;
}int a[30], b[30], c[30], num[30], qu[30], n, cnt;
char s1[30], s2[30], s3[30];
bool used[30];
bool ok(){//最后判断一下是否满足等式for(int i = n - 1, x = 0; i >= 0; --i){int A = num[a[i]], B = num[b[i]], C = num[c[i]];if((A + B + x) % n != C) return 0;x = (A + B + x) / n;}return 1;
}
void print(){//输出printf("%d", num[0]);for(int i = 1; i < n; ++i) printf(" %d", num[i]);exit(0);//减少递归返回时间
}
void dfs(int x){if(num[a[0]] + num[b[0]] >= n) return;//最高位没有进位for(int i = n - 1; i >= 0; --i){int A = num[a[i]], B = num[b[i]], C = num[c[i]];if(A == -1 || B == -1 || C == -1) continue;if((A + B) % n != C && (A + B + 1) % n != C) return;//判每一位是否合法}if(x == n){if(ok()) print();return;}for(int i = n - 1; i >= 0; --i)if(!used[i]){num[qu[x]] = i, used[i] = 1;dfs(x + 1);num[qu[x]] = -1, used[i] = 0;//回溯}
}
void Sort(int x){//预处理递归枚举顺序if(!used[x]) used[x] = 1, qu[cnt++] = x;
}
int main(){freopen("1.txt", "r", stdin);freopen("1.out", "w", stdout);n = read();scanf("%s%s%s", s1, s2, s3);for(int i = 0; i < n; ++i)a[i] = s1[i] - 'A', b[i] = s2[i] - 'A', c[i] = s3[i] - 'A', num[i] = -1;for(int i = n - 1; i >= 0; --i){Sort(a[i]);//预处理顺序Sort(b[i]);Sort(c[i]);}for(int i = 0; i < n; ++i) used[i] = 0;dfs(0);return 0;
}

转载于:https://www.cnblogs.com/kylinbalck/p/11307087.html

【搜索】$P1092$虫食算相关推荐

  1. 【20171111】Codevs 1064 虫食算80分

    题目描述 Description 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045     +    8468# ...

  2. 洛谷——P1092 虫食算

    题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 + 8468#663344445509678 其中$ ...

  3. 【dfs】虫食算(ybtoj dfs-1-3)

    虫食算 ybtoj dfs-1-3 题目大意 给出一个如A+B=C的N进制的式子,现在知道某些位上的数字是相同的,让你求出这个式子 样例输入 5 ABCED BDACE EBBAA 样例输出 1 0 ...

  4. P1092虫食算-深度优先搜索+玄学剪枝

    P1092虫食算 这道题的思想并不复杂,可是难点在于各种玄学剪枝.在仔细研究了题解大佬的剪枝原理后终于氵了过去. 先上代码: #include<cstdio> #include<cs ...

  5. 虫食算(洛谷-P1092)

    题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母. 现在,我们对问题做两个限制: 首先,我们只考虑加法的虫食算.这里的加法是N进制加法,算式中三个数 ...

  6. 虫食算-详解-noip2004-深搜

    虫食算 网址:https://vijos.org/p/1099 描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865# ...

  7. ybtoj DFS 1 拔河比赛 数独游戏 虫食算

    前情详见 dfs+search T1:拔河比赛 拔河比赛两边人数最多不能相差1 . 每个队员都有体重,我们要使两边比赛的人体重和相差最小. 现在有 n 个队员,韩老师想你帮忙分配,并且把分配后两边体重 ...

  8. 洛谷P1092 虫食算

    传送门 分析 看了一下题解,正解是高斯消元,然而我不会...... 于是--搜索! 但直接暴搜的复杂度是 \(O(n!)\) ,肯定会超时,所以需要一些剪枝. 考虑从右向左,从上至下枚举每个数的值. ...

  9. Luogu P1092 虫食算 爆搜

    心路历程:震惊,我竟然得了$90$分!!...康康数据...奥..(忽然有了邪恶的卡数据的想法) 于是把$for(int \space i=0;i<n;++i)$改成了$for(int \spa ...

最新文章

  1. 数据蒋堂 | 从一道招聘考题谈起
  2. mongodb query
  3. Redis | 001能做什么?
  4. 在linux中完整路径中的目录间分隔符是,路径分隔符(斜杠/与反斜杠\的问题)
  5. oracle驱动权限如何修改,详解如何实现Oracle修改用户权限和角色
  6. inventor扳手制作视频_弱电工程视频监控系统施工方案,可作施工组织设计
  7. 一位老工程师的忠告,切记!
  8. STM32之SDIO例程
  9. NOIP2017 列队——动态开点线段树
  10. 浅谈OpenGL、OpenGL ES
  11. Tips--利用shell脚本批量提取txt文件中任意字段
  12. app4788usvod3html,ROBOHAND RPLC-3
  13. 数据分析工具具备什么功能
  14. MFC文档视图中窗口切换 (2012-05-11 18:32:48)
  15. iOS视频直播初窥:高仿喵播APP
  16. python网络爬虫课程设计报告摘要_网络爬虫课程设计报告
  17. 简约商务风ppt模板推荐
  18. 大麻和烟草对表观基因组产生双重影响
  19. 网页调用QQ客服的API
  20. Pytorch下的卷积和池化

热门文章

  1. 问题 1047: [编程入门]报数问题
  2. 第十篇 数据类型总结
  3. 转帖 IBM要推POWER9,来了解一下POWER处理器的前世今生
  4. thinkphp第一节结构
  5. 小不咖啡——自己写着玩的网站
  6. 重载和重写以及重写的权限问题
  7. 关于通过反汇编查看dll的方法【转】(
  8. SWF 文件不能访问本地资源 只有仅限于文件系统的 SWF 文件和可信的本地 SWF 文件可以访问本地资源。...
  9. mysql中的replication_mysql中replication的相关问题总结
  10. Properties 持久的属性集