/*
  这个代码运行的时间长主要是因为每次枚举之后都要重新计算一下和的值!
    如果要快的话,应该在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. Java SE、Java EE、Java ME

    Java SE(Java Platform,Standard Edition).Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用程序.J ...

  2. 虚拟机安装Ubuntu到U盘

    这篇经验中特指系统安装到U盘,系统在U盘上,不是双系统,不会改变源系统的设置.只需在启动的时候选择启动路径,就可以从U盘启动你的系统.本文仅仅Ubuntu系统,举一反三可以按照此方法安装各种各样的系统 ...

  3. 3.一起来学hibernate之配置文件2

    之前的映射文件配置都是简单的.基础的配置,只涉及到单个javabean,对于单个javabean的增删改查都能很好的.简单的去完成. 但是知道简单配置远远不够,并不能完成很多复杂的情况,比如对象与对象 ...

  4. 一张图片说明MII

  5. 关于sitemesh和freemark在struts2中的一些问题总结

    最近刚开始工作,首先让我在熟悉公司编程环境的前提下做一些简单的增删改查,在此总结一些这些天遇到的问题. 1,在刚开始建表的时候,我在oracle数据库中设置的主键id为四位的number类型,对应的实 ...

  6. SQL入门经典(四)之创建和修改数据表

    本章主要讲如何使用脚本创建数据库:如何使用脚本创建表:如何删除对象和修改对象. CREATE 语句:CREATE <object type> <onject name> 创建数 ...

  7. windows系统下的第一个console程序

    窗口+r 键,输入cmd,打开一个命令行窗口 切换到你的目标目录 输入 dotnet new dotnet会自动帮你创建3个文件. NuGet.Config文件主要定义了NuGet获取nupkg包时的 ...

  8. angularjs组件之input mask

    今天将奉献一个在在几个angularjs项目中抽离的angular组件 input mask.在我们开发中经常会对用户的输入进行控制,比如日期,货币格式,或者纯数字格式之类的限制,这就是input m ...

  9. 基于zepto的移动端日期+时间选择插件

    前段时间写了两个移动端的日期选择插件:轻量级移动端日期选择器,本来是为特定的场景中使用的,结果有同学反应不够灵活和强大.虽然我的看法是移动端的界面要尽可能简洁,功能要尽可能简单,但是难免还是会有各种各 ...

  10. html嵌套MP4、PDF的简单方案

    你需要一个jquery.media插件,http://malsup.com/jquery/media/ 然后: <html><head><script src=" ...