/*
  这个代码运行的时间长主要是因为每次枚举之后都要重新计算一下和的值!
    如果要快的话,应该在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枚举,模拟运算过程)的更多相关文章

  1. [poj]开关类问题 枚举 位运算

    poj 1222  EXTENDED LIGHTS OUT 开关只有两种方案 按和不按,按两次相当于关 只用枚举第一排开关的按法即可,剩下的行为使上一排的灯全部关闭,按法可以确定,并且是唯一的. 最后 ...

  2. poj 2965 The Pilots Brothers&#39; refrigerator(dfs 枚举 +打印路径)

    链接:poj 2965 题意:给定一个4*4矩阵状态,代表门的16个把手.'+'代表关,'-'代表开.当16个把手都为开(即'-')时.门才干打开,问至少要几步门才干打开 改变状态规则:选定16个把手 ...

  3. 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 ...

  4. POJ 1753 Flip Game (DFS + 枚举)

    题目:http://poj.org/problem?id=1753 这个题在開始接触的训练计划的时候做过,当时用的是DFS遍历,其机制就是把每一个棋子翻一遍.然后顺利的过了.所以也就没有深究. 省赛前 ...

  5. POJ 1753 Flip Game DFS枚举

    看题传送门:http://poj.org/problem?id=1753 DFS枚举的应用. 基本上是参考大神的.... 学习学习.. #include<cstdio> #include& ...

  6. 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 ...

  7. POJ 1270 Following Orders (拓扑排序,dfs枚举)

    题意:每组数据给出两行,第一行给出变量,第二行给出约束关系,每个约束包含两个变量x,y,表示x<y.    要求:当x<y时,x排在y前面.让你输出所有满足该约束的有序集. 思路:用拓扑排 ...

  8. POJ 3279 Filptile dfs

    题目链接:http://poj.org/problem?id=3279 大意:给出一块n*m的棋盘.里面放满了棋子.有1和0两种状态.给出初始状态,翻动的时候会把当前位置和当前位置的上下左右共五个位置 ...

  9. 【ACwing 93】【模版】非递归实现组合型枚举——模拟递归

    (题面来自ACwing) 从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案. 输入格式 两个整数 n,m ,在同一行用空格隔开. 输出格式 按照从小到大的顺序输出所有方案,每行1个 ...

随机推荐

  1. vc6编译apache遇到的问题

    在apache的官网上下载了httpd-2.0.65-win32-src,打算了解一下其中的细节,以给目前做的一个项目提供抄袭性的参考.那是一个vc6的工程.用vc6一编译,apr那个工程报错,说什么 ...

  2. 深入浅出C#中的静态与非静态

    C#语言静态类 vs 普通类  C#语言静态类与普通类的区别有以下几点: 1)C#语言静态类无法实例化而普通类可以: 2)C#语言静态类只能从System.Object基类继承:普通可以继承其它任何非 ...

  3. selenium总结篇,常见方法和页面元素的操作【转】

    原文:http://www.cnblogs.com/tobecrazy/p/4570494.html 今天,总结一下selenium怎么操作web页面常见的元素. 主要有: 上传 alter dial ...

  4. zTree的功能解析

    zTree ,一个依靠 jQuery 实现的多功能 "树插件".优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点.兼容 IE.FireFox.Chrome 等浏览器, ...

  5. MFC学习随笔(2)

    在MFC中,有时需要多个类之间传递信息,一个共通的头文件是个不错的选择.如果在头文件中直接声明一个变量的话,势必会报出一个错误: error LNK2005: "struct my_glob ...

  6. 《利用Python进行数据分析》第123章学习笔记

    引言 1 列表推导式 records = [json.loads(line) for line in open(path)] 这是一种在一组字符串(或一组别的对象)上执行一条相同操作(如json.lo ...

  7. linux-14基础命令之-复制(cp)移动(mv),删除(rm),拷贝文件(dd)

    1.cp 命令用于复制文件或者目录 格式为:cp[选项]源文件  目标文件 复制名录有三种情况: @1.目标文件是一个目录,将源复制到该目录下:  @2.目标文件是一个文件,将源文件覆盖该文件: @3 ...

  8. SELECT TOP 100 PERCENT 不按后面的order by 排序

    项目中,由于需要把3个状态的任务合并显示,并且按照任务由近及远的顺序排序,类似于下面的语句 order by taskid desc )m union all order by taskid desc ...

  9. C# 调用restful服务开源库

    .NET环境下我们想调用其它开放平台的服务接口,不需要自己去实现底层,开源的库用起来会很方便 hammock http://www.cnblogs.com/shanyou/archive/2012/0 ...

  10. mono for android学习过程系列教程(7)

    首先说个抱歉,这段时候由于个人原因未及时更新博客.故此今天先给大家来个小料. 以后会及时更新我自己的学习过程. 不多说,终于私人生活安定下来了,可以安心学习.直接进入主体: 今天咱们摒弃所有的前面的知 ...