/*
  这个代码运行的时间长主要是因为每次枚举之后都要重新计算一下和的值!
    如果要快的话,应该在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. PADSPCB权威指南-第一章 PADS软件系统(部分)(原创)

    PADSPCB权威指南-第一章(部分)豆丁地址:http://www.docin.com/p-707128286.html

  2. 4..一起来学hibernate之Session详解

    后续... 后续... 后续... 后续... 后续... 后续... 后续... 后续... 后续... 后续... 后续... 后续... 后续... 后续... 后续...

  3. glibc2.14 install from centos

    安装glibc2.14 Tar xf glibc-2.14.tar.gz Cd glibc-2.14 Mkdir build Cd build ../configure –prefix=/opt/gl ...

  4. 解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译)

    解剖SQLSERVER 第十一篇    对SQLSERVER的多个版本进行自动化测试(译) http://improve.dk/automated-testing-of-orcamdf-against ...

  5. 使用call来实现继承

    function Class1(arg1,arg2) { this.name = arg1; this.pass = arg2; this.showSub = function() { return ...

  6. Ubuntu系统下的第一个console程序

    进入自己喜欢的目录,前面步骤和windows基本一致,只简单描述下 执行 dotnet new 然后执行 dotnet restore 然后执行 dotnet run 第一次未编译,会自动编译,然后可 ...

  7. 【css3】--四种气泡

    在聊天的场景中,聊天内容需要用到气泡修饰,如下图.下面一一讲解. 图片式: 第一个样式是京东客服,气泡的圆角和钩子都是用了图片.使用了一个table组合成了一个圆角的框框.lm样式拼出了钩子. < ...

  8. java 堆栈分析

    再次,研究了一个下午的jhat好jmap.从一开始惊呆.懵懂于那样大量而无聊乏味的数据,到现在有那么一点点收货.赶紧记录下来.没办法,悟性太低... C:\Users\Administrator> ...

  9. WebApi系列~按需序列化字段~Hot

    回到目录 起初只是一个想法,一次讨论,一个设想,但相信一定可以实现,具体的事情是这样的,有个对外的API项目,它为一些终端设备提供数据,如手机,平板,PC,当然你也可以说它为很多平台提供数据win32 ...

  10. 爱上MVC3系列~监视Action的运行时间,并提供超时记录机制

    回到目录 文章出现的原因 很久没写关于MVC的文章了,原因是将关注点移向了MVVM和DDD这边,而这篇文章完全是因为公司项目的需要,因为公司网站总是不定时的502,而这由可能是程序超时所引起的,为了分 ...