题目: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. A20地址线问题

    [0]README text description from Zhaojiong's perfect analysis of Linux kernel . [1]A20地址线问题(干货来了) 198 ...

  2. 目标跟踪之camshift---opencv中meanshift和camshift例子的应用

    在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行op ...

  3. EF6&EFCore 注册/使用实体类的正确姿势

    首先回顾下EF中常规使用流程 1.新建实体类以及实体配置(data annotation或fluent api) [Table("Users")] public class Use ...

  4. 五个知识体系之-SQL学习-第三天

    1. sql约束作用 主键约束作用:保证插入数据的有效性.比如性别列,只能是“男”“女”,输入“abc”就是无效的,所以你可以添加约束alter table 表名add constraint chk_ ...

  5. 【题解】DZY Loves Chinese

    [题解]DZY Loves Chinese II 不吐槽这题面了... 考虑如何维护图的连通性,如果把图的变成一颗的\(dfs\)生成树,那么如果把一个节点的父边和他接下来所有的返祖边删除,那么我们就 ...

  6. Django框架创建数据库表时setting文件配置_模型层

    若想将模型转为mysql数据库中的表,需要在settings中配置: 一. 确保配置文件中的INSTALLED_APPS中写入我们创建的app名称-->bms INSTALLED_APPS = ...

  7. 我的Java开发学习之旅------>解惑Java进行三目运算时的自动类型转换

    今天看到两个面试题,居然都做错了.通过这两个面试题,也加深对三目运算是的自动类型转换的理解. 题目1.以下代码输出结果是(). public class Test { public static vo ...

  8. centos 7 官网安装 PostgreSQL

    https://www.postgresql.org/download/linux/redhat/

  9. ABAP 程序运行时间记录表

    自建表记录程序运行时间,测试程序效率,可作为系统优化工具.

  10. 提高iOS开发效率的第三方框架等--不断更新中。。。

    1. Mantle Mantle 让我们能简化 Cocoa 和 Cocoa Touch 应用的 model 层.简单点说,程序中经常要进行网络请求,请求到得一般是 json 字符串,我们一般会建一个 ...