洛谷P1092虫食算——深搜
题目: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虫食算——深搜的更多相关文章
- 洛谷P1092 虫食算
P1092 虫食算 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: http://paste.ubuntu.com/2544 ...
- 洛谷 P1092 虫食算 Label:dfs
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
- [NOIP2004] 提高组 洛谷P1092 虫食算
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
- 洛谷—— P1092 虫食算
https://www.luogu.org/problem/show?pid=1092 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简 ...
- 洛谷 p1092 虫食算
题目链接: https://www.luogu.org/problemnew/show/P1092 这个题折腾了我好久 这其实本质上是一道凑算式的题目 ,让一个二维数组存算式,一个一位数组存字母分别代 ...
- 洛谷P1092 虫食算(算竞进阶习题)
模拟+dfs 这个题就三行,搜索的话我们从右向左,从上到下.. 如果是在1,2行我们就直接枚举0-n所有数,但是到了第三行,最直接的就是填上这一列上前两行的数的和modN,在此基础上判断该填的数有没有 ...
- Luogu P1092 虫食算 爆搜
心路历程:震惊,我竟然得了$90$分!!...康康数据...奥..(忽然有了邪恶的卡数据的想法) 于是把$for(int \space i=0;i<n;++i)$改成了$for(int \spa ...
- P1092 虫食算 题解(搜索)
题目链接 P1092 虫食算 解题思路 好题啊!这个搜索好难写...... 大概是要考虑进位和考虑使用过某个数字这两个东西,但就很容易出错...... 首先这个从后往前搜比较好想,按照从后往前出现的顺 ...
- 【题解】 P1092虫食算
[题解]P1092 虫食算 老题了,很经典. 用到了一些搜索套路. 可行性剪枝,劣者靠后,随机化,\(etc......\) 搜索设参也很有技巧,设一个\(adjustment\)参数可以很方便地在两 ...
随机推荐
- golang 格式化时间成datetime
Golang或者Beego,总需要往数据库里写datetime时间戳. Golang对时间格式支持并不理想. 先看一个例子: package main import ( "fmt" ...
- Redis单台的安装部署及集群部署
Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(diff ...
- U盘中毒变成exe快捷键文件不见问题
大家好,大家能够叫我阿胜,今天给我大家带一个有用小方法,希望对大家有帮助.去学校打印社打印东西,U盘中病毒,使U盘文件所有变成快捷键了,这个坑爹的打印社.这时我该怎么办...... 嘿嘿.阿胜给 ...
- Android-DrawerLayout介绍
DrawerLayout已经出来非常久了,个人认为国内的app都深受ios的毒害在设计上都争先模仿ios的风格,都忘了什么是独特的Android风格.自己得先学的然后跟产品争取在项目中使用上一系列的A ...
- Using ADO.NET Data Service
ADO.NET Data Service是随同Visual Studio 2008 SP1提供的用于构建在数据对象模型 (如EF-DEMX, LINQ-DBML) 之时来快速提供企业网内外的轻量级数据 ...
- 总是想把Linux服务器上的重要文件备份到本地,在此转一篇实现windows和linux互传文件的文章
尝试从windows xp向ubuntu11.10传文件 ubuntu使用的是ssh windows使用的是putty和其附带的pscp 首先配置ubuntu: 1.先使用netstat -tl或se ...
- Channel (digital image) 通道 色彩深度 Color_depth
en.wikipedia.org/wiki/Channel_(digital_image) Color digital images are made of pixels, and pixels ar ...
- 【题解】Sumdiv
[题解]Sumdiv 传送门 根据组合的乘法原理,一个数的所有约数和 \[ sum=\prod_{i=1} \Sigma_j^{a_i} p_i^j \] 所以任务就变成了分解\(A\)的质因数,分解 ...
- 一起来学linux:例行性任务之at和crontab
对于我们日常生活来说,有很多例行需要进行的工作,比如每天早上起床一杯水,例如家人的生日,每天的起床时间等.这性例行的工作有可能被遗忘,但是如果我们用计算机来进行提醒的话,则方便很多.这里就要介绍到Li ...
- Linux下Mysql数据库忘记root
系统环境:Red Hat Enterprise Linux Server 6 1.停止mysqld服务 [root@Server huage]# service mysqld stop 2.以跳过授权 ...