题目: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. JavaScript读书笔记(6)-Array RegExp

    1.Array类型 ECMAScript数组的每一项可以保存任何类型的数据,数组的大小也可以动态调整: (1) 创建数组 第一种方式:Array构造函数 var colors=new Array(); ...

  2. Eclipse工程前面有个红色的感叹号的解决办法

    今天从SVN下载下工程之后,编译完,发现有两个工程有个红色的感叹号,一直没找到什么原因,问百度老师,发现问题的解决办法了. 1.先在控制台上点击Problems 如果控制台没有Problems,点击工 ...

  3. TP实例化模型的两种方式 M() D()

    TP框架中实例化模型的两种方式 #如果使用自己自定义的函数,那么就用D $mode=D('model'); #如果使用是系统自带的函数,那么就是用M $model=M('model');

  4. Java学习之路 第四篇 oop和class (面向对象和类)

    本人水平有限,创作本文是为了记录学习和帮助初学者学习,欢迎指正和补充 一.面向对象编程的设计概述 很多同学都在学校学了电脑的编程,现在的书籍大部分都是oop面向对象编程,一个很抽象的的名字,比较难以理 ...

  5. 模式识别之svm()---支持向量机svm 简介1995

    转自:http://www.blogjava.net/zhenandaci/archive/2009/02/13/254519.html 作者:Jasper 出自:http://www.blogjav ...

  6. 三分钟教你学Git(十二) 之 fast-forward

    什么是fast forward, 顾名思义,就是高速向前进,Git怎么做到高速的呢? 原来假设Git判定能够fast forward的时候,直接改动当前HEAD指针的指向然后再改动当前HEAD指针.说 ...

  7. WCF配置心得

    根据蒋金楠老师的博文所说的, WCF的终结点有三个要素组成,分别是地址(Address).绑定(Binding)和契约(Contract),简记可写成Endpoint = ABC. 地址:地址决定了服 ...

  8. Android异步处理二:使用AsyncTask异步更新UI界面

    在<Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面>中,我们使用Thread+Handler的方式实现了异步更新UI界面,这一篇中,我们介绍一种更为简 ...

  9. ms人物上线

    在看MS人物上线 else if(gs2ms_add_player == pkt.cmd) { PlayerChannel* pPC = new PlayerChannel(this); //加到地图 ...

  10. 九度OJ 1009:二叉搜索树 (二叉树)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6321 解决:2767 题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需 ...