心路历程:震惊,我竟然得了$90$分!!。。。康康数据。。。奥。。(忽然有了邪恶的卡数据的想法)

于是把$for(int \space i=0;i<n;++i)$改成了$for(int \space i=n-1;i>0;--i) $

然后,我$90$~

然后,我开了$O2$,$A$了$OvO$。。。

upd:然后第二天:可以再加个剪枝?

what,我A了?$41ms(without \space O2)or \space 33ms (with \space O2)$

(所以就当我的是正解了$qwq$)

我的思路很暴力:

我的思路很暴力:
由于最后一位没有进位,所以这一列的三个字母的关系是确定的,而不会像后面一样存在进位,所以就是暴力大枚举,对于竖式的每一列,枚举没用过的数,然后判一下这一列是否合法(记得要累积上一位的进位),合法的话,再判一下整个竖式所有已知数是否合法,合法接着搜,不合法枚举下一个。。。复杂度玄学。。。

又臭又长又慢的代码$qwq$

解释一下:$s[i][j]$是指第$i$行的第$j$个字母(已在$void\space gs()$中转化为数字,'A'对应$0$,'B'对应$1$,以此类推),$rw[x]$指x(已经转化为数字的字母)所代表的真正数字,$vis[x]$表示$x$有没有被使用过,$inc[i]$表示第$i$列有没有进位。

$90pts$

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<iomanip>
#include<vector>
#include<map>
#include<set>
#define ll long long
#define R register int
static char B[<<],*S=B,*D=B;
#define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<8,stdin),S==D)?EOF:*S++)
using namespace std;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
inline void gs(int* c) {
register char ch; while(!isalpha(ch=getchar()));
do *++c=int(ch-'A'); while(isalpha(ch=getchar()));
} int n,rw[],s[][],inc[];
bool vis[];
inline void dfs(int x) {
if(x==) {for(R i=;i<n;++i) printf("%d ",rw[i]); exit();} //print();
if(rw[s[][x]]==-) {
for(R i=n-;i>=;--i) if(!vis[i]) {
rw[s[][x]]=i,vis[i]=true;
if(rw[s[][x]]==-) {
for(R j=;j<n;++j) if(!vis[j]){
rw[s[][x]]=j,vis[j]=true;
if(rw[s[][x]]==-) {
rw[s[][x]]=(rw[s[][x]]+rw[s[][x]]+inc[x]);
if(rw[s[][x]]>=n) rw[s[][x]]%=n,inc[x-]=;
if(vis[rw[s[][x]]]) {rw[s[][x]]=-; inc[x-]=; goto ed2;}
vis[rw[s[][x]]]=true; dfs(x-); inc[x-]=; vis[rw[s[][x]]]=false; rw[s[][x]]=-;
} else {
if(rw[s[][x]]==(rw[s[][x]]+rw[s[][x]]+inc[x])%n) inc[x-]=(rw[s[][x]]+rw[s[][x]]+inc[x])/n,dfs(x-),inc[x-]=;
}
ed2: rw[s[][x]]=-,vis[j]=false;
}
} else {
if(rw[s[][x]]==-) {
rw[s[][x]]=(rw[s[][x]]+rw[s[][x]]+inc[x]);
if(rw[s[][x]]>=n) rw[s[][x]]%=n,inc[x-]=;
if(vis[rw[s[][x]]]) {rw[s[][x]]=-; inc[x-]=; goto enddd;}
vis[rw[s[][x]]]=true; dfs(x-); inc[x-]=; vis[rw[s[][x]]]=false; rw[s[][x]]=-;
} else {
if(rw[s[][x]]==(rw[s[][x]]+rw[s[][x]]+inc[x])%n) inc[x-]=(rw[s[][x]]+rw[s[][x]]+inc[x])/n,dfs(x-),inc[x-]=;
else {inc[x-]=; }
} enddd:;
} rw[s[][x]]=-,vis[i]=false;
}
} else {
if(rw[s[][x]]==-) {
for(R j=n-;j>=;--j) if(!vis[j]) {
rw[s[][x]]=j,vis[j]=true;
if(rw[s[][x]]==-) {
rw[s[][x]]=(rw[s[][x]]+rw[s[][x]]+inc[x]);
if(rw[s[][x]]>=n) rw[s[][x]]%=n,inc[x-]=;
if(vis[rw[s[][x]]]) {rw[s[][x]]=-; inc[x-]=; goto ed21;}
vis[rw[s[][x]]]=true; dfs(x-); inc[x-]=; vis[rw[s[][x]]]=false; rw[s[][x]]=-;
} else {
if(rw[s[][x]]==(rw[s[][x]]+rw[s[][x]]+inc[x])%n) inc[x-]=(rw[s[][x]]+rw[s[][x]]+inc[x])/n,dfs(x-),inc[x-]=;
} ed21: vis[j]=false;
} rw[s[][x]]=-;
} else {
if(rw[s[][x]]==-) {
rw[s[][x]]=(rw[s[][x]]+rw[s[][x]]+inc[x]);
if(rw[s[][x]]>=n) rw[s[][x]]%=n,inc[x-]=;
if(vis[rw[s[][x]]]) {rw[s[][x]]=-; inc[x-]=; goto end;}
vis[rw[s[][x]]]=true; dfs(x-); inc[x-]=; vis[rw[s[][x]]]=false; rw[s[][x]]=-;
} else {
if(rw[s[][x]]==(rw[s[][x]]+rw[s[][x]]+inc[x])%n) inc[x-]=(rw[s[][x]]+rw[s[][x]]+inc[x])/n,dfs(x-),inc[x-]=;
} end:;
}
}
} signed main() {
n=g(); for(R i=;i<=;++i) gs(s[i]);
memset(rw,0xff,sizeof(rw)); dfs(n);
}

$100pts$

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<iomanip>
#include<vector>
#include<map>
#include<set>
#define ll long long
#define R register int
static char B[<<],*S=B,*D=B;
#define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<8,stdin),S==D)?EOF:*S++)
using namespace std;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
inline void gs(int* c) {
register char ch; while(!isalpha(ch=getchar()));
do *++c=int(ch-'A'); while(isalpha(ch=getchar()));
} int n,rw[],s[][],inc[];
bool vis[];
inline bool ck() {
for(R i=;i<=n;++i) {
if(rw[s[][i]]!=-&&(rw[s[][i]])!=-&&(rw[s[][i]])!=-) {
if(((rw[s[][i]])+(rw[s[][i]])+)%n!=(rw[s[][i]])&&((rw[s[][i]])+(rw[s[][i]]))%n!=rw[s[][i]]) return false;
}
} return true;
}
inline void dfs(int x) {
if(x==) if(!inc[]){for(R i=;i<n;++i) printf("%d ",rw[i]); exit();} //print();
else return ;
if(rw[s[][x]]==-) {
for(R i=n-;i>=;--i) if(!vis[i]) {
rw[s[][x]]=i,vis[i]=true;
if(rw[s[][x]]==-) {
for(R j=;j<n;++j) if(!vis[j]){
rw[s[][x]]=j,vis[j]=true;
if(rw[s[][x]]==-) {
rw[s[][x]]=(rw[s[][x]]+rw[s[][x]]+inc[x]);
if(rw[s[][x]]>=n) rw[s[][x]]%=n,inc[x-]=;
if(vis[rw[s[][x]]]||!ck()) {rw[s[][x]]=-; inc[x-]=; goto ed2;}
vis[rw[s[][x]]]=true; dfs(x-); inc[x-]=; vis[rw[s[][x]]]=false; rw[s[][x]]=-;
} else {
if(rw[s[][x]]==(rw[s[][x]]+rw[s[][x]]+inc[x])%n&&ck()) inc[x-]=(rw[s[][x]]+rw[s[][x]]+inc[x])/n,dfs(x-),inc[x-]=;
}
ed2: rw[s[][x]]=-,vis[j]=false;
}
}
else {
if(rw[s[][x]]==-) {
rw[s[][x]]=(rw[s[][x]]+rw[s[][x]]+inc[x]);
if(rw[s[][x]]>=n) rw[s[][x]]%=n,inc[x-]=;
if(vis[rw[s[][x]]]||!ck()) {rw[s[][x]]=-; inc[x-]=; goto enddd;}
vis[rw[s[][x]]]=true; dfs(x-); inc[x-]=; vis[rw[s[][x]]]=false; rw[s[][x]]=-;
} else {
if(rw[s[][x]]==(rw[s[][x]]+rw[s[][x]]+inc[x])%n&&ck()) inc[x-]=(rw[s[][x]]+rw[s[][x]]+inc[x])/n,dfs(x-),inc[x-]=;
else {inc[x-]=; }
} enddd:;
} rw[s[][x]]=-,vis[i]=false;
}
} else {
if(rw[s[][x]]==-) {
for(R j=n-;j>=;--j) if(!vis[j]) {
rw[s[][x]]=j,vis[j]=true;
if(rw[s[][x]]==-) {
rw[s[][x]]=(rw[s[][x]]+rw[s[][x]]+inc[x]);
if(rw[s[][x]]>=n) rw[s[][x]]%=n,inc[x-]=;
if(vis[rw[s[][x]]]||!ck()) {rw[s[][x]]=-; inc[x-]=; goto ed21;}
vis[rw[s[][x]]]=true; dfs(x-); inc[x-]=; vis[rw[s[][x]]]=false; rw[s[][x]]=-;
} else {
if(rw[s[][x]]==(rw[s[][x]]+rw[s[][x]]+inc[x])%n&&ck()) inc[x-]=(rw[s[][x]]+rw[s[][x]]+inc[x])/n,dfs(x-),inc[x-]=;
} ed21: vis[j]=false;
} rw[s[][x]]=-;
} else {
if(rw[s[][x]]==-) {
rw[s[][x]]=(rw[s[][x]]+rw[s[][x]]+inc[x]);
if(rw[s[][x]]>=n) rw[s[][x]]%=n,inc[x-]=;
if(vis[rw[s[][x]]]||!ck()) {rw[s[][x]]=-; inc[x-]=; goto end;}
vis[rw[s[][x]]]=true; dfs(x-); inc[x-]=; vis[rw[s[][x]]]=false; rw[s[][x]]=-;
} else {
if(rw[s[][x]]==(rw[s[][x]]+rw[s[][x]]+inc[x])%n&&ck()) inc[x-]=(rw[s[][x]]+rw[s[][x]]+inc[x])/n,dfs(x-),inc[x-]=;
} end:;
}
}
} signed main() {
#ifdef JACK
freopen("NOIPAK++.in","r",stdin);
#endif
n=g(); for(R i=;i<=;++i) gs(s[i]);
memset(rw,0xff,sizeof(rw)); dfs(n);
}

2019.06.06

Luogu P1092 虫食算 爆搜的更多相关文章

  1. Luogu P1092 虫食算(枚举+剪枝)

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

  2. Luogu P1092 虫食算

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

  3. 洛谷P1092虫食算——深搜

    题目:https://www.luogu.org/problemnew/show/P1092 剪枝1:从右往左.从上往下按字母出现顺序搜索: 剪枝2:同一列前两个数字确定,可直接算出第三个数字并判断: ...

  4. Luogu P1092 虫食算【搜索/剪枝】 By cellur925

    题目传送门 这道题是一道经久不衰的搜索题目,但是开始做的时候我没什么思路==.初始值-1 输出格式 \(naive\)想法 从右往左依次尝试填充数字,把算式当做一个3行\(n\)列的网格.(什么?你问 ...

  5. P1092 虫食算 题解(搜索)

    题目链接 P1092 虫食算 解题思路 好题啊!这个搜索好难写...... 大概是要考虑进位和考虑使用过某个数字这两个东西,但就很容易出错...... 首先这个从后往前搜比较好想,按照从后往前出现的顺 ...

  6. 洛谷P1092 虫食算

    P1092 虫食算 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: http://paste.ubuntu.com/2544 ...

  7. 【题解】 P1092虫食算

    [题解]P1092 虫食算 老题了,很经典. 用到了一些搜索套路. 可行性剪枝,劣者靠后,随机化,\(etc......\) 搜索设参也很有技巧,设一个\(adjustment\)参数可以很方便地在两 ...

  8. 洛谷 P1092 虫食算 Label:dfs

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

  9. 洛谷—— P1092 虫食算

    https://www.luogu.org/problem/show?pid=1092 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简 ...

随机推荐

  1. Git初始化配置以及配置github

    1,配置用户名和邮箱(这里是我github中配置的用户名和邮箱),执行下面命令后,在C:\Users\yaosq盘下会出现一个全局文件.gitconfig. git config --global u ...

  2. php静态调用非静态方法

    <?php /** * php静态调用非静态方法 * author: 百里 * Date: 2019/7/18 * Time: 17:28 */ function dump(...$var) { ...

  3. 【转载】MyBatis批量插入数据(insert)

    介绍:MyBatis批量插入数据,原理就是在xml文件中添加 foreach 语句,然后MyBatis自动在values后面添加多个括号: XML文件如下: <?xml version=&quo ...

  4. 【Python基础】02_Python中变量的输入输出

    1.变量的输入: input函数: input() input("请输入银行卡密码") password = input("请输入银行卡密码") 变量名 = i ...

  5. Python基础 第三章 使用字符串(1)精简版

    所有标准序列操作(索引,切片,乘法,成员资格检查,长度,最小值,最大值)都适于字符串. 但,字符串是不可变得,故所有得元素赋值和切片赋值都是非法的. 1. %s 转换说明符 设置字符串格式 %左边指定 ...

  6. React-脚手架

    1. Node和NPM 版本 2. 脚手架 在对React比较熟悉之前,为了避免陷入到开发工具的繁琐配置中,借助react官方提供的脚手架工具Create React App来搭建React应用 np ...

  7. luogu4777[模板]拓展中国剩余定理题解

    题目链接 https://www.luogu.org/problemnew/show/P4777 分析 扩展\(CRT\)就是解决模数不互质的情况,说是扩展\(CRT\),其实都是扩欧... 先来考虑 ...

  8. 关于SpringBoot的自动配置和启动过程

    一.简介 Spring Boot简化了Spring应用的开发,采用约定大于配置的思想,去繁从简,很方便就能构建一个独立的.产品级别的应用. 1.传统J2EE开发的缺点 开发笨重.配置繁多复杂.开发效率 ...

  9. Graphics与Canvas

    Graphics: 1. java.awt.Graphics;2.android.graphics Canvas:1.java.awt.Canvas;2.android.graphics.Canvas ...

  10. bootstrap-selectpicker 插件事件

    $('#id').on('show.bs.select', function (e) { //绑定下拉显示列表触发事件 }); $('#id').on('hidden.bs.select', func ...