【搜索】$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;
}
【搜索】$P1092$虫食算的更多相关文章
- 洛谷 P1092 虫食算 Label:dfs
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
- 深度优先搜索 codevs 1064 虫食算
codevs 1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所 ...
- codevs1064 虫食算
题目描述 Description 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 + 8468#6 ...
- NOIP2004 虫食算
描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子:43#9865#045+ 8468#6633= 44445506678其中#号代表 ...
- Codevs 1064 虫食算 2004年NOIP全国联赛提高组
1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所谓虫食算,就是原先的算式 ...
- Luogu P1092 虫食算
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
- 【NOIP2004】【CJOJ1703】【洛谷1092】虫食算
题面 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 ...
- 【NOIP2004】虫食算
Description 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +. 8468#6633 444455 ...
- 洛谷P1092 虫食算
P1092 虫食算 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: http://paste.ubuntu.com/2544 ...
- 【题解】 P1092虫食算
[题解]P1092 虫食算 老题了,很经典. 用到了一些搜索套路. 可行性剪枝,劣者靠后,随机化,\(etc......\) 搜索设参也很有技巧,设一个\(adjustment\)参数可以很方便地在两 ...
随机推荐
- WebAPI 身份认证解决方案——Phenix.NET企业应用软件快速开发平台.使用指南.21.WebAPI服务(一)
21 WebAPI服务 ASP.NET Web API,是微软在.NET Framework 4.5上推出的轻量级网络服务框架,虽然作为ASP.NET MVC 4的一部分,但却是一套全新的.独立的 ...
- python爬虫---scrapy框架爬取图片,scrapy手动发送请求,发送post请求,提升爬取效率,请求传参(meta),五大核心组件,中间件
# settings 配置 UA USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, l ...
- html5单词
< meta charset = " UTF-8 " > 国内编码 (meta-标签用来描述一个HTML网页文档的属性 charset-字 ...
- CSS文本单行或者多行超出区域省略号(...)显示方法
单行超出时,主要用到几个CSS属性: 1.text-overflow : clip | ellipsis ; clip : 不显示省略标记(...),而是简单的裁切ellipsis : 当对象内文本溢 ...
- Vue组件开发分享
在开始本文之前,你可能需要先了解以下相关内容: Vue.js 一款高性能轻量化的MVVM框架 Webpack 前端模块化代码构建工具 Vue组件介绍 基于vue.js高效的双向数据绑定特性,让我们 ...
- MES系统帮助冷轧厂实现次品的流程解析
为了解决现场实际生产过程中纸质不良品卡片易丢失.周期长.传递缓慢,不能起到质量警示和生产预警等诸多方面的问题,某冷轧厂采取了在MES系统中实现不良品业务流程的方案,完全替代和取消了纸质不良品卡片,在M ...
- Maven打包的三种方式
Maven可以使用mvn package指令对项目进行打包,如果使用Java -jar xxx.jar执行运行jar文件,会出现"no main manifest attribute, in ...
- 无法读取例程 &ROUTINE 中配置文件选项 FND_DEVELOPER_MODE
问题描述:OM>发运>事务处理,进入此界面,FORM出现报错信息:无法读取例程 &ROUTINE 中配置文件选项 FND_DEVELOPER_MODE 解决办法:在系统管理员下,设 ...
- MySQL与Oracle的隔离级别
一.事务和隔离级别 事务的概念:事务是把对数据库的一系列操作都看做一个整体,要么全部成功,要么全部失败,利用事务我们可以保证数据库的完整性,事务具有原子性. 隔离级别:隔离级别定义了事务与事务之间的隔 ...
- Golang: 解析JSON数据之二
上次我们介绍了 Go 语言中序列化和反序列化 JSON 数据的两个方法 Marshal() 和 Unmarshal(),并以示例演示了它们的用法. 我们在例子中看到,需要事先声明好对应的结构体,才能跟 ...