心路历程:震惊,我竟然得了$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. hdu 1024 最大m段不相交线段和

    题目传送门//res tp hdu 数据范围1e6,若是开二维会爆 考虑用滚动数组优化 #include<iostream> #include<cstdio> #include ...

  2. python中int是什么类型

    python中的基本数据类型 1:虽然python中的变量不需要声明,但使用时必须赋值整形变量浮点型变量字符型2:可以一个给多个变量赋值,也可以多个给多个变量赋值3:python3中有6个标准数据类型 ...

  3. fontmin字体子集

    怕忘了做个记录 链接:http://ecomfe.github.io/fontmin/#feature 特点:方便,快捷.

  4. python flask 如何读取数据库数据并返回到html

    app.py from flask import Flask from flask import render_template from flask_bootstrap import Bootstr ...

  5. ubuntu+nginx+uwsgi部署django web项目

    前言 将本地开发的django项目部署至linux上的uwsgi服务器,并配置nginx,完成基于ubuntu+nginx+uwsgi的上线运行.下面整理相关步骤. 服务器配置virtualenv 如 ...

  6. Jmeter4.0---- 测试数据说明(17)

    1.说明 jmeter工具对于请求的测试结果,有多种形式展现,但是数据比较难懂,现在针对不同的展现做具体的说明. 2.监听器 (一)图形结果 (1)样本数目:总共发到服务器的请求数 (2)最新样本:服 ...

  7. vue阻止右键默认行为

    vue阻止右键默认行为 <!--不阻止右键菜单(浏览器行为),右键执行函数show--> <input type="button" value="按钮& ...

  8. JS写斐波那契数列的几种方法

    斐波那契数,指的是这样一个数列:1.1.2.3.5.8.13.21.……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字 ...

  9. 买条Vineyard Vines裙子为啥子那么难?因为能遮胖?因为英国王子穿过?

    为了这件vineyard vines, 我周六冒雨,去斯坦福shopping center说卖完了,我冒雨赶回家,上网买到了,今天早上发email说没货了,自动取消我的订单.我下午又打了40分钟电话给 ...

  10. JavaScript Basics_Fundamentals Part 2_A simple calendar

    下方的日历框架是从 Active learning: A simple calendar 上整过来的. 主要任务是用 if...else 语句来让日历本显示出每月相对应的天数,相关代码已经给出,我们只 ...