题目:https://www.luogu.org/problemnew/show/P1092

剪枝1:从右往左、从上往下按字母出现顺序搜索;

剪枝2:同一列前两个数字确定,可直接算出第三个数字并判断;

剪枝3:每次搜索前看看前面的列上有没有已经不符合的情况(进位最多为1);

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int n,c[300],jin[30];
char a[5][30];
bool vis[30],p[300];
bool check(int y)
{
for(int i=y;i>=0;i--)
if(p[a[1][i]]&&p[a[2][i]]&&p[a[3][i]]&&
((c[a[1][i]]+c[a[2][i]])%n!=c[a[3][i]])&&
((c[a[1][i]]+c[a[2][i]]+1)%n!=c[a[3][i]]))return 1;
return 0;
}
void ser(int x,int y)
{
if(check(y))return;
if(y<0)
{
for(int i=65;i<=91;i++)
if(p[i])
printf("%d ",c[i]);
return;
}
if(x==3)
{
int k=c[a[1][y]]+c[a[2][y]]+jin[y];
int t=0;
while(k>=n)t++,k-=n;
jin[y-1]=t;
// printf("y=%d k=%d jin[%d]=%d\n",y,k,y,jin[y]);
// jin[y]=0;
if(!p[a[x][y]]&&!vis[k])
{
// printf("%c=%d\n",a[x][y],k);
c[a[x][y]]=k;
p[a[x][y]]=1;
vis[k]=1;
ser(1,y-1);
c[a[x][y]]=0;
p[a[x][y]]=0;
vis[k]=0;
return;
}
else if(p[a[x][y]]&&vis[k]&&c[a[x][y]]==k)
{
ser(1,y-1);
return;
}
else
{
// jin[y-1]=0;
return;
}
}
else if(!p[a[x][y]])
{
for(int i=0;i<n;i++)
{
if(!vis[i])
{
// printf("x=%d y=%d a=%c i=%d\n",x,y,a[x][y],i);
c[a[x][y]]=i;
p[a[x][y]]=1;
vis[i]=1;
ser(x+1,y);
c[a[x][y]]=0;
p[a[x][y]]=0;
vis[i]=0;
}
}
}
else ser(x+1,y);
}
int main()
{
scanf("%d ",&n);
cin>>a[1];
cin>>a[2];
cin>>a[3];
ser(1,n-1);
return 0;
}
/*
20 NLHFIEASBRQJOGKMDPCT NQGPSIIGKDMFDCBFMQSO PNKNTOLHEIJHFGJKHJGG
*/

  

洛谷P1092虫食算——深搜的更多相关文章

  1. 洛谷P1092 虫食算

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

  2. 洛谷 P1092 虫食算 Label:dfs

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

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

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

  4. 洛谷—— P1092 虫食算

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

  5. 洛谷 p1092 虫食算

    题目链接: https://www.luogu.org/problemnew/show/P1092 这个题折腾了我好久 这其实本质上是一道凑算式的题目 ,让一个二维数组存算式,一个一位数组存字母分别代 ...

  6. 洛谷P1092 虫食算(算竞进阶习题)

    模拟+dfs 这个题就三行,搜索的话我们从右向左,从上到下.. 如果是在1,2行我们就直接枚举0-n所有数,但是到了第三行,最直接的就是填上这一列上前两行的数的和modN,在此基础上判断该填的数有没有 ...

  7. Luogu P1092 虫食算 爆搜

    心路历程:震惊,我竟然得了$90$分!!...康康数据...奥..(忽然有了邪恶的卡数据的想法) 于是把$for(int \space i=0;i<n;++i)$改成了$for(int \spa ...

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

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

  9. 【题解】 P1092虫食算

    [题解]P1092 虫食算 老题了,很经典. 用到了一些搜索套路. 可行性剪枝,劣者靠后,随机化,\(etc......\) 搜索设参也很有技巧,设一个\(adjustment\)参数可以很方便地在两 ...

随机推荐

  1. 将參数从PHP传递到JavaScript中

    php: //自己定义数组參数 $newarr = array('a1' => 'a1', 'a2' => 'a2', 'a3' => 'a3'); $config = CJavaS ...

  2. HTML5,不仅仅是看上去非常美(第二弹:打造最美3D机房)

    前言 近期项目开发任务告一段落,刚好有时间整理这大半年的一些成果.使用html5时间还不久,对js的认识还不够深入.没办法,曾经一直搞java,对js的一些语言特性和概念一时还转换只是来. 上一篇第一 ...

  3. 提高Interface Builder高效工作的8个技巧

    本文转载至 http://www.cocoachina.com/ios/20141106/10151.html iOS开发Interface Builder 本文译自:8 Tips for worki ...

  4. python 基础 1.5 python数据类型(四)--字典

    一.python 数据类型--字典 1.用字符串存储信息,如:存储“姓名,身高,性别”: In [1]: info='Tom 170 M' //字符串存储信息 In [3]: info[0:3] // ...

  5. 【BZOJ3065】带插入区间K小值 替罪羊树+权值线段树

    [BZOJ3065]带插入区间K小值 Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理 ...

  6. 升级webapi依赖的Newtonsoft.json的版本(转)

    随着微软日渐重视开源社区的贡献,微软在自己的产品中往往也会集成开源的第三方库. 比如System.Net.Http.Foramatting.dll 就依赖于Newtonsoft.json v4.5. ...

  7. JavaScript 原型解析

    1.什么是对象?     javascript中除了null和undefined之外都是Object的实例. 在Javascript中, 每定义一个函数, 将伴生一个原型对象. 原型就是用来为同一类对 ...

  8. pgsql 数据类型

  9. Linux入门基础(一)——ls、mkdir命令

  10. Java for LeetCode 081 Search in Rotated Sorted Array II

    Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...