poj 1950 Dessert(dfs枚举,模拟运算过程)
/*
这个代码运行的时间长主要是因为每次枚举之后都要重新计算一下和的值!
如果要快的话,应该在dfs,也就是枚举的过程中计算出前边的数值(这种方法见第二个代码),直到最后,这样不必每一次枚举都要从头再算一遍值!
*/
1 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; char ch[];
char sign[]={'+', '-', '.'};
int n, cnt;
int num[];
int signNum[]; void dfs(int u){
if(u==n){
if(signNum['+']==n- || signNum['+']+signNum['.']==n- || signNum['.']==n- || signNum['-']==n-) return;
for(int i=; i<n; ++i){
num[i]=i;
if(ch[i]=='.'){
int s=i, v=i;
while(i<n && ch[i]=='.'){
if(i+>)
s=s*+(++i);
else s=s*+(++i);
}
if(s>) return ;//非得加上这句话....然后就幸运的过了!
num[v]=s;
--i;
}
}
num[n]=n;
int s=num[];
for(int i=; i<n; ++i)
if(ch[i]!='.'){
if(ch[i]=='+') s+=num[i+];
else s-=num[i+];
}
if(s==){
++cnt;
if(cnt<=){
for(int i=; i<n; ++i)
printf("%d %c ", i, ch[i]);
printf("%d\n", n);
}
}
return;
}
for(int i=; i<; ++i){
ch[u]=sign[i];
++signNum[sign[i]];
dfs(u+);
--signNum[sign[i]];
}
} int main(){
while(scanf("%d", &n)!=EOF){
cnt=;
dfs();
printf("%d\n", cnt);
}
return ;
}
/*
清晰的思路,清晰的代码.....T^T!
*/
1 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
char sign[]={'+', '-', '.'};
int n, cnt;
char ch[];
int dir[]={, }; //pre记录的是'+' 或者是 '-'的左边的运算值, nowI记录的是其右边的值
void dfs(char chPre, int pre, int nowI, int cur){
if(cur==n){
int s=-;
if(chPre=='+')
s=pre+(nowI*dir[cur/]+cur);
else if(chPre=='-')
s=pre-(nowI*dir[cur/]+cur);
//如果chPre=='.' 说明整个式子中不存在运算符号+或者-, 那最终的结果一定不是0
if(s==){
++cnt;
if(cnt<=){
for(int i=; i<n; ++i)
printf("%d %c ", i, ch[i]);
printf("%d\n", n);
}
}
return ;
}
for(int i=; i<; ++i){
ch[cur]=sign[i];
if(ch[cur]!='.'){
if(chPre=='+')
dfs(ch[cur], pre+(nowI*dir[cur/]+cur), , cur+);
else if(chPre=='-')
dfs(ch[cur], pre-(nowI*dir[cur/]+cur), , cur+);
else dfs(ch[cur], pre*dir[cur/]+cur, , cur+);
}
else{
//之前出现了运算符,当前不是运算符
if(chPre=='+' || chPre=='-')//一直累计nowI的值
dfs(chPre, pre, nowI*dir[cur/]+cur, cur+);
else //如果之前没有出现过运算符+或者-,一直累计pre的值
dfs(chPre, pre*dir[cur/]+cur, , cur+);
}
}
} int main(){
while(scanf("%d", &n)!=EOF){
cnt=;
dfs(' ', , , );
printf("%d\n", cnt);
}
return ;
}
poj 1950 Dessert(dfs枚举,模拟运算过程)的更多相关文章
- [poj]开关类问题 枚举 位运算
poj 1222 EXTENDED LIGHTS OUT 开关只有两种方案 按和不按,按两次相当于关 只用枚举第一排开关的按法即可,剩下的行为使上一排的灯全部关闭,按法可以确定,并且是唯一的. 最后 ...
- poj 2965 The Pilots Brothers' refrigerator(dfs 枚举 +打印路径)
链接:poj 2965 题意:给定一个4*4矩阵状态,代表门的16个把手.'+'代表关,'-'代表开.当16个把手都为开(即'-')时.门才干打开,问至少要几步门才干打开 改变状态规则:选定16个把手 ...
- poj 1753 Flip Game(bfs状态压缩 或 dfs枚举)
Description Flip game squares. One side of each piece is white and the other one is black and each p ...
- POJ 1753 Flip Game (DFS + 枚举)
题目:http://poj.org/problem?id=1753 这个题在開始接触的训练计划的时候做过,当时用的是DFS遍历,其机制就是把每一个棋子翻一遍.然后顺利的过了.所以也就没有深究. 省赛前 ...
- POJ 1753 Flip Game DFS枚举
看题传送门:http://poj.org/problem?id=1753 DFS枚举的应用. 基本上是参考大神的.... 学习学习.. #include<cstdio> #include& ...
- POJ 2429 GCD & LCM Inverse (Pollard rho整数分解+dfs枚举)
题意:给出a和b的gcd和lcm,让你求a和b.按升序输出a和b.若有多组满足条件的a和b,那么输出a+b最小的.思路:lcm=a*b/gcd lcm/gcd=a/gcd*b/gcd 可知a/gc ...
- POJ 1270 Following Orders (拓扑排序,dfs枚举)
题意:每组数据给出两行,第一行给出变量,第二行给出约束关系,每个约束包含两个变量x,y,表示x<y. 要求:当x<y时,x排在y前面.让你输出所有满足该约束的有序集. 思路:用拓扑排 ...
- POJ 3279 Filptile dfs
题目链接:http://poj.org/problem?id=3279 大意:给出一块n*m的棋盘.里面放满了棋子.有1和0两种状态.给出初始状态,翻动的时候会把当前位置和当前位置的上下左右共五个位置 ...
- 【ACwing 93】【模版】非递归实现组合型枚举——模拟递归
(题面来自ACwing) 从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案. 输入格式 两个整数 n,m ,在同一行用空格隔开. 输出格式 按照从小到大的顺序输出所有方案,每行1个 ...
随机推荐
- overview
[1] Don’t panic! All will become clear in time; [2] You don’t have to know every detail of C++ to wr ...
- Eclipse安装与配置
http://www.th7.cn/Program/java/201307/144477.shtml http://www.eclipse.org/ 我们下载J2EE版本:Eclipse IDE fo ...
- Attic 0.8.1 发布,备份程序
Attic 0.8.1 修复了昨天刚发布的 Attic 0.8 的一个段错误. Attic 是一个可以保证文件不重复的备份程序.Attic 的主要目标是提供一个高效和安全的方法来备份数据.重复数据删除 ...
- SQL入门经典(七) 之脚本和批处理
什么是脚本.我们前面学的CREATE TABLE <table name> ,USE <database name>这些都是脚本,为什么用脚本.脚本存储到文件中并且可以重复利用 ...
- angular ng-repeat+sortable 拖拽demo
由于项目需求,需要使用angular 实现列表的增.删.改,并且列表支持拖拽. 看了下angular-ui 里面的sortable组件,使用起来也是非常简单,几十行代码就完成了所需功能. 我现在懒得想 ...
- 在UWP应用中加入Cortana语音指令集
本文介绍小娜语音指令集的使用场景,如何将UWP应用接入小娜的语音指令集,使用户直接通过小娜启动应用并使用应用中 一些轻量级的功能.文中以必应词典作为实例讲解必应词典UWP版本是如何接入小娜语音功能的. ...
- java提高篇(十四)-----字符串
可以证明,字符串操作是计算机程序设计中最常见的行为. 一.String 首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象.查看源码就会发现String类为f ...
- Facebook 发布「流程」
时不时就会在面试过程中碰到有候选人问 Facebook 是否采用 Scrum 之类的敏捷方法,偶尔也会有中国的朋友问及 Facebook 上线流程.我通常会简单说几句,然后说「如果你真感兴趣的话,去搜 ...
- 关于Windows高DPI的一些简单总结
我们知道,关于高DPI的支持, Windows XP时代就开始有了, 那时关于高DPI的支持比较简单, 但是从Vista/Win7 到现在Win8 /Win8.1, Windows关于高DPI的支持已 ...
- C#中使用反射获取结构体实例
一般用反射获取类对象的实例比较简单,只要类有一个无参构造函数或没有显示声明带参的构造函数即可使用如下代码 static void Main(string[] args) { Type type = t ...