code1064 虫食算
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 虫食算的更多相关文章
- 洛谷 P1092 虫食算 Label:dfs
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
- 深度优先搜索 codevs 1064 虫食算
codevs 1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所 ...
- codevs1064 虫食算
题目描述 Description 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 + 8468#6 ...
- NOIP2004 虫食算
描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子:43#9865#045+ 8468#6633= 44445506678其中#号代表 ...
- Codevs 1064 虫食算 2004年NOIP全国联赛提高组
1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所谓虫食算,就是原先的算式 ...
- Luogu P1092 虫食算
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
- 【NOIP2004】【CJOJ1703】【洛谷1092】虫食算
题面 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 ...
- 【NOIP2004】虫食算
Description 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +. 8468#6633 444455 ...
- 洛谷P1092 虫食算
P1092 虫食算 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: http://paste.ubuntu.com/2544 ...
随机推荐
- 2、ambari搭建HDP集群
一.平台环境 操作系统:CentOS release 6.5 (Final) Java版本:jdk1.8.0_60 Ambari版本:2.2.1.0 HDP版本:2.4.0 MySQL版本:MySQL ...
- beego的配置文件记录
摘自https://github.com/beego/tutorial/blob/master/zh/3/params.slide * beego的默认参数 - AppName 应用名称,默认是 be ...
- waitpid()设置WNOHANG位(非阻塞模式)判断子进程的状态是否有所改变
参考<Linux/Unix系统编程手册>26.1.5,对于系统调用waitid() #include <sys/wait.h> int waitid(idtype_t idty ...
- Service的用法
基本用法: 1.创建一个类继承Service类,并重写onBind() 2.重写其他方法:onCreate().onStartCommand().onDestory() 3.在AndroidManif ...
- HttpClient基础用法
一.HttpClient HttpClient是Apache HttpComponents 下的子项目,用来提供高效的.最新的.功能丰富的支持HTTP协议的客户端编程工具包(httpclient-4. ...
- iOS开发API常用英语名词
iOS开发API常用英语名词 0. indicating 决定 1.in order to 以便 2.rectangle bounds 矩形尺寸 3.applied 应用 4.entirety 全部 ...
- 前端基础——jQuery
一 jQuery 1 简介 jQuery是一个“写得更少,但做得更多”的轻量级JavaScript库.jQuery极大地简化了JavaScript编程. 它是轻量级的js库(压缩后只有21k) ,这是 ...
- 一些常用的centos命令,记忆下,属于常用的
一些常用的centos命令,记忆下,属于常用的 查询内网IP hostname -I 查询外网IP curl ifconfig.me 查看硬盘使用情况 df -h 查看系统资源使用率 top 查看系统 ...
- 版本控制git之二-分支
有人把 Git 的分支模型称为它的`‘必杀技特性’',也正因为这一特性,使得 Git 从众多版本控制系统中脱颖而出. 为何 Git 的分支模型如此出众呢? Git 处理分支的方式可谓是难以置信的轻量, ...
- Vim配置:在win10下用vim编译运行C/C++(异步插件管理,一键运行)
为什么用Vim 重新调配vim,追求尽量简单些. 安装 官网下载 PC: MS-DOS and MS-Windows下的 For modern MS-Windows systems (starting ...