dfs搜索每个字母对应的数字

剪枝:

1.当一列上三个数a b c都已知时,如果 (a+b)%n!=c && (a+b+1)%n!=c 剪枝(+1是考量进位,注意&&)

2.考虑到我们根据每排数据剪枝的,我们可以改变一下搜索的顺序,按照字母从上往下,从右往左出现的顺序来搜

3.因为我们是从最低位开始搜的,而且,3个数全都是N位,所以高位数组一般较小,低位较大,所以 应该从n-1倒过来搜(高位太大和就不是N位了)

代码:

#include<iostream>
#include<cstdlib>
#include<cstring>
#define Size 30
using namespace std; int n;
int cc[][Size];
int dic[Size]={, ,,,,};
bool vis[Size]; bool row(int i){
if(dic[cc[][i]]!=-&&dic[cc[][i]]!=-&&dic[cc[][i]]!=-){
int k=dic[cc[][i]]+dic[cc[][i]];
if(k%n!=dic[cc[][i]] && (k+)%n!=dic[cc[][i]])return false;
}
return true;
} int next(){
for(int i=;i<=n;i++){
for(int j=;j<;j++){
if(dic[cc[j][i]]==-)return cc[j][i];
}
}
return n+;
} bool check(){
int dd[][Size];
for(int i=;i<;i++){
for(int j=;j<=n;j++){
dd[i][j]=dic[cc[i][j]];
}
}
int f[Size];
memset(f,,sizeof(f));
for(int i=;i<=n;i++){
f[i]+=dd[][i];f[i]+=dd[][i];
while(f[i]>=n)f[i]-=n,f[i+]++;
if(f[i]!=dd[][i])return false;
}
return true;
} void dfs(int k){
if(k>n){
if(check()){
for(int i=;i<=n;i++)cout<<dic[i]<<' ';
exit();
}
}
//jianzhi
for(int i=;i<=n;i++){//
if(!row(i))return;
} for(int i=n-;i>=;i--){
if(!vis[i]){
dic[k]=i;
vis[i]=true;
dfs(next());
vis[i]=false;
dic[k]=-;
}
}
} int main(){
freopen("1064.in","r",stdin);
memset(dic,-,sizeof(dic));
cin>>n;
char temp[Size];
for(int i=;i<;i++){
cin>>temp+;
for(int j=;j<=n;j++){
cc[i][j]=temp[n-j+]-;
}
}
dfs(next());
return ;
}
测试点#alpha1.in  结果:AC    内存使用量:  256kB     时间使用量:  1ms     
测试点#alpha10.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#alpha2.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#alpha3.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#alpha4.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#alpha5.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#alpha6.in 结果:AC 内存使用量: 256kB 时间使用量: 31ms
测试点#alpha7.in 结果:AC 内存使用量: 256kB 时间使用量: 3ms
测试点#alpha8.in 结果:AC 内存使用量: 256kB 时间使用量: 78ms
测试点#alpha9.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms

code1064 虫食算的更多相关文章

  1. 洛谷 P1092 虫食算 Label:dfs

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

  2. 深度优先搜索 codevs 1064 虫食算

    codevs 1064 虫食算 2004年NOIP全国联赛提高组  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description 所 ...

  3. codevs1064 虫食算

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

  4. NOIP2004 虫食算

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

  5. Codevs 1064 虫食算 2004年NOIP全国联赛提高组

    1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所谓虫食算,就是原先的算式 ...

  6. Luogu P1092 虫食算

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

  7. 【NOIP2004】【CJOJ1703】【洛谷1092】虫食算

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

  8. 【NOIP2004】虫食算

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

  9. 洛谷P1092 虫食算

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

随机推荐

  1. 2、ambari搭建HDP集群

    一.平台环境 操作系统:CentOS release 6.5 (Final) Java版本:jdk1.8.0_60 Ambari版本:2.2.1.0 HDP版本:2.4.0 MySQL版本:MySQL ...

  2. beego的配置文件记录

    摘自https://github.com/beego/tutorial/blob/master/zh/3/params.slide * beego的默认参数 - AppName 应用名称,默认是 be ...

  3. waitpid()设置WNOHANG位(非阻塞模式)判断子进程的状态是否有所改变

    参考<Linux/Unix系统编程手册>26.1.5,对于系统调用waitid() #include <sys/wait.h> int waitid(idtype_t idty ...

  4. Service的用法

    基本用法: 1.创建一个类继承Service类,并重写onBind() 2.重写其他方法:onCreate().onStartCommand().onDestory() 3.在AndroidManif ...

  5. HttpClient基础用法

    一.HttpClient HttpClient是Apache HttpComponents 下的子项目,用来提供高效的.最新的.功能丰富的支持HTTP协议的客户端编程工具包(httpclient-4. ...

  6. iOS开发API常用英语名词

    iOS开发API常用英语名词 0. indicating 决定 1.in order to 以便 2.rectangle bounds 矩形尺寸 3.applied 应用 4.entirety 全部 ...

  7. 前端基础——jQuery

    一 jQuery 1 简介 jQuery是一个“写得更少,但做得更多”的轻量级JavaScript库.jQuery极大地简化了JavaScript编程. 它是轻量级的js库(压缩后只有21k) ,这是 ...

  8. 一些常用的centos命令,记忆下,属于常用的

    一些常用的centos命令,记忆下,属于常用的 查询内网IP hostname -I 查询外网IP curl ifconfig.me 查看硬盘使用情况 df -h 查看系统资源使用率 top 查看系统 ...

  9. 版本控制git之二-分支

    有人把 Git 的分支模型称为它的`‘必杀技特性’',也正因为这一特性,使得 Git 从众多版本控制系统中脱颖而出. 为何 Git 的分支模型如此出众呢? Git 处理分支的方式可谓是难以置信的轻量, ...

  10. Vim配置:在win10下用vim编译运行C/C++(异步插件管理,一键运行)

    为什么用Vim 重新调配vim,追求尽量简单些. 安装 官网下载 PC: MS-DOS and MS-Windows下的 For modern MS-Windows systems (starting ...