心路历程:震惊,我竟然得了$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. Python 解LeetCode:33. Search in Rotated Sorted Array

    题目描述:在一个旋转数组中查找给定的值,其中旋转数组中不含重复值: 思路: 第一遍二分遍历,找到数组中最小值的索引: 第二遍分别对最小值左右两边的数组进行二分查找: class Solution(ob ...

  2. (四)mybatis 的主键返回

    目录 文章目录 自增主键(LAST_INSERT_ID()) 非自增主键(UUID() ) 自增主键(LAST_INSERT_ID()) 在映射关系文件中配置 <!--插入用户--> &l ...

  3. Education Reform(CodeForces-119C)【DP】

    题意:从m门课选出n个排到n天,每天一门,难度须递增,每门课对应着一个作业量Xi,且Xi = Xi-1 + k or Xi - Xi-1 * k,总作业量要尽可能大,问能否排布,若能排布,求方案. 思 ...

  4. 【Python基础】15_Python中的变量-进阶

    1.引用的概念 2.可变类型和不可变类型 3.哈希

  5. Python实现八大排序(基数排序、归并排序、堆排序、简单选择排序、直接插入排序、希尔排序、快速排序、冒泡排序)

    目录 八大排序 基数排序 归并排序 堆排序 简单选择排序 直接插入排序 希尔排序 快速排序 冒泡排序 时间测试 八大排序 大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列 ...

  6. JArray

    [{ "A001033": "", ", ", ", ", ", ", ", " ...

  7. 怎样启动和关闭nginx服务器

    启动: 直接使用命令: nginx nginx 关闭1: 快速停止 nginx -s stop 关闭2: 完整有序停止 nginx -s quit 重启: 如下 nginx -s reload

  8. 怎样理解ECMAScript 和 JavaScript的关系

    JavaScript可以分为三大部分: 1. 核心语法 2. DOM 3. BOM 而核心语法实际上就是指的ECMAScript, 而JS又是不断在发展的, 而这个发展实际上最主要的就是ECMAScr ...

  9. JavaScript 的编译原理

    JavaScript 是一门编译语言. JavaScript 的编译是发生在代码执行前的几微米(甚至更短)的事件内,所以 JavaScript 没有其他语言那么多的时间来进行优化. 当 JavaScr ...

  10. 如何使用cgdb(一)——窗口切换

    cgdb是一个轻量级的基于控制台的多窗口gdb调试界面.除了标准的gdb控制台之外,cgdb还提供了一个分屏视图,可以在执行的时候显示具备语法高亮的源代码.键盘控制是仿照vim设计的,所以vim用户使 ...