/*
  这个代码运行的时间长主要是因为每次枚举之后都要重新计算一下和的值!
    如果要快的话,应该在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. Linux内核--网络栈实现分析(七)--数据包的传递过程(下)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7545855 更多请查看专栏,地 ...

  2. unity 实现简单的分离

    在网上随便搜一搜资料就可以找到很多关于Mvc ,MVVM,StrangeIoc等有关显示与数据分离的博客,很多大神也是讲的蛮有道理的,但是这些框架理解起来有一定的难度, 这时候肯定有人说有现成的框架为 ...

  3. [ASE][Daily Scrum]12.05

    占坑 最近大家都很忙所以工作准备放到周末来做……所以这两天进度会比较慢.

  4. ASP.NET MVC3 Razor 初心者容易遇到的問題(转)

    这是一些相关的文章地址 http://demo.tc/Post/679 http://blog.csdn.net/cheny_com/article/details/6298496

  5. 我的ORM之十二 -- 支持的数据库及差别

    我的ORM索引 支持最好的是SqlServer2005,Sqlserver2008,SqlServer2012 ,后续将支持:MySql,Sqlite,Oracle. 1.分页差别 MsSql 200 ...

  6. 可在广域网部署运行的QQ高仿版 -- GG叽叽V2.4,增加远程协助、桌面共享功能(源码)

    QQ的远程协助.或者说桌面共享是一个非常实用的功能,所以,2.4版本的GG复制了它,而且,GG增强了桌面共享的功能,它可以允许指定要共享桌面的区域,这样,对方就只能看到指定区域的桌面,这对节省流量会非 ...

  7. ReentrantLock实现原理深入探究

    前言 这篇文章被归到Java基础分类中,其实真的一点都不基础.网上写ReentrantLock的使用.ReentrantLock和synchronized的区别的文章很多,研究ReentrantLoc ...

  8. 【C语言学习】《C Primer Plus》第11章 字符串和字符串函数

    学习总结 1.字符串(character String)是以空字符串(\o)结尾的char数组. 2.gets()方法代表get String,它从系统的标准输入设备(通常是键盘)获取一个字符串,当字 ...

  9. JavaScript使用DeviceOne开发实战(一) 配置和起步

    2015 年 9 月 底,DeviceOne Release发布.至此,DeviceOne 基本完成了对多端的支持.基于 DeviceOne 可以: HTML5.Android.iOS.Windows ...

  10. ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的

    最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...