Luogu P1092 虫食算 爆搜
心路历程:震惊,我竟然得了$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 虫食算 爆搜的更多相关文章
- Luogu P1092 虫食算(枚举+剪枝)
P1092 虫食算 题面 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 + 8468#6633 4 ...
- Luogu P1092 虫食算
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
- 洛谷P1092虫食算——深搜
题目:https://www.luogu.org/problemnew/show/P1092 剪枝1:从右往左.从上往下按字母出现顺序搜索: 剪枝2:同一列前两个数字确定,可直接算出第三个数字并判断: ...
- Luogu P1092 虫食算【搜索/剪枝】 By cellur925
题目传送门 这道题是一道经久不衰的搜索题目,但是开始做的时候我没什么思路==.初始值-1 输出格式 \(naive\)想法 从右往左依次尝试填充数字,把算式当做一个3行\(n\)列的网格.(什么?你问 ...
- P1092 虫食算 题解(搜索)
题目链接 P1092 虫食算 解题思路 好题啊!这个搜索好难写...... 大概是要考虑进位和考虑使用过某个数字这两个东西,但就很容易出错...... 首先这个从后往前搜比较好想,按照从后往前出现的顺 ...
- 洛谷P1092 虫食算
P1092 虫食算 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: http://paste.ubuntu.com/2544 ...
- 【题解】 P1092虫食算
[题解]P1092 虫食算 老题了,很经典. 用到了一些搜索套路. 可行性剪枝,劣者靠后,随机化,\(etc......\) 搜索设参也很有技巧,设一个\(adjustment\)参数可以很方便地在两 ...
- 洛谷 P1092 虫食算 Label:dfs
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
- 洛谷—— P1092 虫食算
https://www.luogu.org/problem/show?pid=1092 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简 ...
随机推荐
- Redis 常用命令整理
哈希表:设置秒中某个字段 HMSET KEY_NAME FIELD1 VALUE1 ...FIELDN VALUEN EX: 127.0.0.1:6380> hmset set_map LOGD ...
- CF1032B Personalized Cup
一个多月前写的题,既然没人写题解,那蒟蒻就写一篇吧 基本思路 既然是输出任意一个解,那么号的位置在那里是没有关系的.我的思路是默认*号在最后面,然后对输入的字符串输出的行数进行分类. 代码 #incl ...
- VBA学习资料分享-2
想利用VBA自动创建/发送OUTLOOK邮件,可以借助MailItem的Body属性或HTMLBody属性,代码模板如下: Dim objOutlook As Outlook.Application ...
- Java实现发邮件功能---网易邮箱
目录 Java实现发邮件功能 前言 开发环境 代码 效果 结束语 Java实现发邮件功能 前言 电子邮件的应用场景非常广泛,例如新用户加入,即时发送优惠清单.通过邮件找回密码.监听后台程序,出现异常自 ...
- vue + echarts 实现中国地图 展示城市
Demo 安装依赖 vue中安装echarts npm install echarts -S 在main.js中引用 import echarts from 'echarts'Vue.prototyp ...
- vue项目中使用特殊字体
项目开发中遇到要是有‘数字’字体的情况,样式如下 网上查了一下实现的方法很简单,而且具体的实现方式大致相同,可以参考以下几个链接: https://www.cnblogs.com/zhangnan35 ...
- 【Distributed】互联网安全架构
一.常见Web安全漏洞 1.1 XSS攻击 什么是XSS攻击手段 如何防御XSS攻击 1.2 SQL注入攻击 什么是SQL注入 SQL注入防攻击手段 MyBatis #与$区别 1.3 Http请求防 ...
- 【python】导入自定义模块
一.直接import 1.当执行文件与要导入的py文件在同一目录下时 假设要在wangyi.py中导入weibo.py文件 import weibo 2.当执行文件与要导入的py文件所在文件夹在同一目 ...
- go语言怎么从(json后的)多层map中取值
// 一个PHP中的多层关联数组,即Go中的多层map,如何从json字符串中解析,然后取到map中的某个具体的值. // 数据结构如下: cityInfo := "{ "stat ...
- ListSetAndMap
package com.collection.test; import java.util.ArrayList; import java.util.HashMap; import java.util. ...