【题解】P1092 虫食算

老题了,很经典。

用到了一些搜索套路。

可行性剪枝,劣者靠后,随机化,\(etc......\)

搜索设参也很有技巧,设一个\(adjustment\)参数可以很方便地在两个方程之间切换。

调试递归最好在递归到下一层递归之前输出关键信息。

// luogu-judger-enable-o2
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<bitset>
#include<vector>
#include<map>
#include<ctime>
#include<cstdlib>
#include<set>
#include<bitset>
#include<stack>
#include<list>
#include<cmath>
using namespace std;
#define RP(t,a,b) for(register int (t)=(a),edd_=(b);t<=edd_;++t)
#define DRP(t,a,b) for(register int (t)=(a),edd_=(b);t>=edd_;--t)
#define ERP(t,a) for(int t=head[a];t;t=e[t].nx)
#define Max(a,b) ((a)<(b)?(b):(a))
#define Min(a,b) ((a)<(b)?(a):(b))
#define TMP template<class ccf>
#define lef L,R,l,mid,pos<<1
#define rgt L,R,mid+1,r,pos<<1|1
#define midd register int mid=(l+r)>>1
#define chek if(R<l||r<L)return
#define all 1,n,1
#define pushup(x) seg[(x)]=seg[(x)<<1]+seg[(x)<<1|1]
typedef long long ll;
TMP inline ccf qr(ccf k){
char c=getchar();
ccf x=0;
int q=1;
while(c<48||c>57)
q=c==45?-1:q,c=getchar();
while(c>=48&&c<=57)
x=x*10+c-48,c=getchar();
if(q==-1)
x=-x;
return x;
}
const int maxn=27;
int ans[maxn];
int arcans[maxn];
bool usd[maxn];
int data[maxn][maxn];
int n;
inline int trs(char c){
return c-'A'+1;
} inline bool jde(int x){
RP(t,x+1,n){
bool flg=0;
RP(i,1,3)
if(!usd[data[t][i]])
flg=1;
if(flg)
continue;
int sav=ans[data[t][1]]+ans[data[t][2]];
int to=ans[data[t][3]];
if(sav!=to&&sav!=to-1&&sav!=to+n&&sav!=to+n-1)
return 1;
}
return 0;
} int dx[maxn];
void dfs(int now,int pos,int adj){ if(ans[data[n][1]]+ans[data[n][2]]>=n&&usd[data[n][1]]&&usd[data[n][2]]||jde(now))
return;
if(pos==3&&now==n){
DRP(i,n-1,0){ register int t=dx[i];
if(!arcans[t]){
usd[(data[now][3])]=1;
ans[(data[now][3])]=t;
arcans[t]=(data[now][3]); if(adj==ans[(data[now][3])]){
RP(t,1,n)
cout<<ans[t]<<' ';
cout<<endl;
exit(0);
} usd[(data[now][3])]=0;
ans[(data[now][3])]=0;
arcans[t]=0;
}
}
if(adj==ans[(data[now][3])]){
RP(t,1,n)
cout<<ans[t]<<' ';
cout<<endl;
exit(0);
}
return; }
if(pos==3){
if(usd[(data[now][3])]){
if(adj==ans[(data[now][3])])
dfs(now+1,1,0);
if(adj==ans[(data[now][3])]+n)
dfs(now+1,1,1);
}
else{
DRP(i,n-1,0){ register int t=dx[i];
if(!arcans[t]){
arcans[t]=(data[now][pos]);
ans[(data[now][pos])]=t;
usd[(data[now][pos])]=1; if(adj==ans[(data[now][3])])
dfs(now+1,1,0);
if(adj==ans[(data[now][3])]+n)
dfs(now+1,1,1); arcans[t]=0;
ans[(data[now][pos])]=0;
usd[(data[now][pos])]=0;
}
}
}
return;
}
if(usd[(data[now][pos])]){
dfs(now,pos+1,ans[(data[now][pos])]+adj);
}
else{
DRP(i,n-1,0){
register int t=dx[i];
if(!arcans[t]){
arcans[t]=(data[now][pos]);
ans[(data[now][pos])]=t;
usd[(data[now][pos])]=1; dfs(now,pos+1,ans[(data[now][pos])]+adj); arcans[t]=0;
ans[(data[now][pos])]=0;
usd[(data[now][pos])]=0;
}
}
}
return;
} int main(){
// freopen("alpha.in","r",stdin);
// freopen("alpha.out","w",stdout);
srand(time(NULL));
char c;
n=qr(1);
RP(t,1,3){
RP(i,1,n){
cin>>c;
data[n+1-i][t]=trs(c);
}
}
RP(t,0,n-1)
dx[t]=t;
random_shuffle(dx,dx+n);
dfs(1,1,0);
return 0;
}

【题解】 P1092虫食算的更多相关文章

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

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

  2. 洛谷P1092 虫食算

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

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

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

  4. 洛谷 P1092 虫食算 Label:dfs

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

  5. Luogu P1092 虫食算

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

  6. [NOIP2004] 提高组 洛谷P1092 虫食算

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

  7. 洛谷—— P1092 虫食算

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

  8. 【搜索】$P1092$虫食算

    题目链接 首先,我们只考虑加法的虫食算.这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0. 其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同 ...

  9. P1092 虫食算(洛谷)

    今天做了一道题,我之前吹牛的时候曾经说:“这个题我觉得深搜剪枝一下就可以了.”. 我觉得我之前说的没错“这个题深搜剪枝亿下,再加点玄学就可以了!” 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子 ...

随机推荐

  1. Xamarin XAML语言教程Xamarin.Forms中活动指示器的显示隐藏

    Xamarin XAML语言教程Xamarin.Forms中活动指示器的显示隐藏 开发者除了可以在XAML中使用IsRunning属性控制指示器的显示隐藏外,还可以在代码隐藏文件中使用IsRunnin ...

  2. Java 在Word创建表格

    表格作为一种可视化交流模式及组织整理数据的手段,在各种场合及文档中应用广泛.常见的表格可包含文字.图片等元素,我们操作表格时可以插入图片.写入文字及格式化表格样式等.下面,将通过Java编程在Word ...

  3. Akka之Actor生命周期

    我们首先来看一下官方给出的Actor的声明周期的图: 在上图中,Actor系统中的路径代表一个地方,其可能会被活着的Actor占据.最初路径都是空的.在调用actorOf()时,将会为指定的路径分配根 ...

  4. 一款不错的编程字体Source Code Pro

    我以前一直是用的MS自家的是Consolas的字体,这个字体基本上具有编程字体所需的所有要素:等宽.支持ClearType.中文字体大小合适,l和1,o和0很容易区分.非要挑刺的话就是字体比较小,9号 ...

  5. 终端应用变身文件 MD5/SHA1 校验工具

    担心下载的文件被恶意篡改?没有找到 Mac 平台文件校验工具?其实 Mac OS X 系统中已经内置了“文件 MD5/SHA1 校验工具”,它就藏身于终端(Terminal)应用中! 打开终端应用,输 ...

  6. xshell登录到CentOS7上时出现“The remote SSH server rejected X11 forwarding request.

    其原因是肯能对openssh版本进行了升级. 解决方法为:         yum install xorg-x11-font* xorg-x11-xauth        /etc/ssh/sshd ...

  7. 2017.3.14 activiti实战--第二十章--REST服务

    学习资料:<Activiti实战> 第二十章 REST服务 20.1 通信协议概述 略. 20.2 REST API概述 资源分类 资源基础URI 说明 Deployments manag ...

  8. VUE 路由变化页面数据不刷新问题

    出现这种情况是因为依赖路由的params参数获取写在created生命周期里面,因为相同路由二次甚至多次加载的关系 没有达到监听,退出页面再进入另一个文章页面并不会运行created组件生命周期,导致 ...

  9. C/C++内存管理详解(转)

    内存分配方式 简介 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动 ...

  10. crm操作业务部门

    using System;     using System.Linq;     using Microsoft.Xrm.Sdk;     using Microsoft.Crm.Sdk.Messag ...