心路历程:震惊,我竟然得了$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. c# bitmap的拷贝及一个图像工具类

    using (Bitmap bmp = new Bitmap(scanImgPath)) { Bitmap bitmap = new Bitmap(bmp.Width, bmp.Height, Pix ...

  2. C++继承种类

  3. 【搜索】n的约数

    题目链接:传送门 [题解]: 考察dfs和质因数分解,首先开一个prime数组. 参数解释: 1.当前值的大小.[利用题目的n来控制范围] 2.控制下界,每次都是以某一个质数开始搜索, pos 3.控 ...

  4. 第一章、web应用安全概论--web应用系统介绍--TCP/IP协议

    TCP/IP协议源于1969年,是国际互联网Internet采用的协议标准TCP/IP协议是一组通信协议的代名词,是由一系列协议组成的协议族,本身是指两个协议集:    TCP--传输控制协议    ...

  5. Istio技术与实践02:源码解析之Istio on Kubernetes 统一服务发现

    前言 文章Istio技术与实践01: 源码解析之Pilot多云平台服务发现机制结合Pilot的代码实现介绍了Istio的抽象服务模型和基于该模型的数据结构定义,了解到Istio上只是定义的服务发现的接 ...

  6. Iedis - Redis 在IDEA中的可视化工具破解

    2.如何破解 // 如果你没有改动IDEA的话,IDEA的插件库在这个目录下C:\Users\Administrator\.IntelliJIdea2017.3\config\plugins\Iedi ...

  7. ztree入门

    ztree入门 ztree可用于权限管理,机构部门等有层次的数据 准备工作 ztree官网 点击右上角的GitHub或者码云的地址将demo下载到本地 在本地新建一个项目,将下载的文件中zTreeSt ...

  8. git基本操作及实用工具

    //git1.安装客户端git Git-2.9.3-rebase-i-64-bit.exe2.安装完成后打开git bashgit config --global user.name "li ...

  9. @media screen媒体查询实现页面自适应布局

    @media screen and (min-width:1200px){ //大于等于1200px才会进入 }   @media screen and (max-width:375px) { //小 ...

  10. DX使用随记--GroupControl

    1. 创建按钮: (1)添加引用:Imports DevExpress.XtraEditors.ButtonsPanelControl (2)添加按钮语句:GroupControl1.CustomHe ...