poj 1950 Dessert(dfs枚举)

 /*     这个代码运行的时间长主要是因为每次枚举之后都要重新计算一下和的值!    如果要快的话,应该在dfs,也就是枚举的过程中计算出前边的数值,知道最后,这样不必每一次枚举都要从头再算一遍值! */ 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 char ch[20];
 8 char sign[3]={‘+‘, ‘-‘, ‘.‘};
 9 int n, cnt;
10 int num[20];
11 int signNum[200];
12
13 void dfs(int u){
14     if(u==n){
15        if(signNum[‘+‘]==n-1 || signNum[‘+‘]+signNum[‘.‘]==n-1 || signNum[‘.‘]==n-1 || signNum[‘-‘]==n-1) return;
16        for(int i=1; i<n; ++i){
17                num[i]=i;
18                if(ch[i]==‘.‘){
19                  int s=i, v=i;
20                  while(i<n && ch[i]==‘.‘){
21                      if(i+1>9)
22                       s=s*100+(++i);
23                     else s=s*10+(++i);
24                  }
25                  if(s>10000) return ;//非得加上这句话....然后就幸运的过了!
26                  num[v]=s;
27                  --i;
28             }
29        }
30        num[n]=n;
31        int s=num[1];
32        for(int i=1; i<n; ++i)
33              if(ch[i]!=‘.‘){
34                if(ch[i]==‘+‘) s+=num[i+1];
35                else s-=num[i+1];
36           }
37        if(s==0){
38                ++cnt;
39                if(cnt<=20){
40                    for(int i=1; i<n; ++i)
41                       printf("%d %c ", i, ch[i]);
42                    printf("%d\n", n);
43                }
44        }
45        return;
46      }
47     for(int i=0; i<3; ++i){
48         ch[u]=sign[i];
49         ++signNum[sign[i]];
50         dfs(u+1);
51         --signNum[sign[i]];
52     }
53 }
54
55 int main(){
56     while(scanf("%d", &n)!=EOF){
57         cnt=0;
58         dfs(1);
59         printf("%d\n", cnt);
60     }
61     return 0;
62 } 
时间: 2024-10-15 00:55:16

poj 1950 Dessert(dfs枚举)的相关文章

POJ 1950 Dessert

题目链接~~ 题意 : 给你 n ( 1 <= n <= 15) 个数(1 . 2 . 3 . 4 ....) 在这些数中间添加 + ,-  ,.,使得最终的计算结果为 0 ,如果情况不大于 20 种 ,则输出全部,否则最多输出 前20 种,按字典序输出. 解题思路 :这题和在广东区域赛的热身赛的一题差不多,深搜枚举所有情况,就是处理点的时候需要注意,同时处理的的情况大于等于 10 的数字应该乘 100 . 代码: #include <iostream> #include <

POJ 1753 Flip Game (DFS + 枚举)

题目:http://poj.org/problem?id=1753 这个题在开始接触的训练计划的时候做过,当时用的是DFS遍历,其机制就是把每个棋子翻一遍,然后顺利的过了,所以也就没有深究. 省赛前一次做PC2遇到了几乎一模一样的题,只不过是把棋盘的界限由4X4改为了5X5,然后一直跑不出结果来,但是当时崔老湿那个队过了,在最后总结的时候,崔老湿就说和这个题一样,不过要枚举第一行进行优化. 我以为就是恢复第一行然后第二行以此类推,不过手推一下结果是6不是4,就知道这个有问题. 问了崔老湿,问了+

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

链接:poj 2965 题意:给定一个4*4矩阵状态,代表门的16个把手,'+'代表关,'-'代表开,当16个把手都为开(即'-')时,门才能打开,问至少要几步门才能打开 改变状态规则:选定16个把手中的任意一个,可以改变其本身以及同行同列的状态(即若为开,则变为关,若为关,则变为开),这一次操作为一步. 分析:这题与poj 1753思路差不多,每个把手最多改变一次状态, 所有整个矩阵最多改变16次状态 思路:直接dfs枚举所有状态,直到找到目标状态 但是要打印路径,所有应在dfs时记录路径 注

poj 2965 The Pilots Brothers&#39; refrigerator 【dfs+枚举】【双十一大礼包】

The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27522   Accepted: 10625   Special Judge Description The game “The Pilots Brothers: following the stripy elephant” has a quest where a player needs to open

poj 1753 Flip Game(bfs状态压缩 或 dfs枚举)

Description Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 squares. One side of each piece is white and the other one is black and each piece is lying either it's black or white side up. Each round you f

Dearboy&#39;s Puzzle (poj 2308 搜索 dfs+bfs)

Language: Default Dearboy's Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1202   Accepted: 208 Description Dearboy is a game lover. Recently, he loves playing the game Lian Lian Kan. This game is played on a board with N*M grids

POJ1288 Sly Number(高斯消元 dfs枚举)

由于解集只为{0, 1, 2}故消元后需dfs枚举求解 #include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<vector> #include<cmath

HDU 4068 dfs枚举

SanguoSHA Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 944    Accepted Submission(s): 520 Problem Description Sanguosha has a singled version. Two players each select N heroes and start fight

codeforce Pashmak and Buses(dfs枚举)

1 /* 2 题意:n个同学,k个车, 取旅游d天! 3 要求所有的学生没有两个或者两个以上的在同一辆车上共同带d天! 输出可行的方案! 4 5 对于d行n列的矩阵,第i行第j列表示的是第i天第j个同学所在的车号! 6 也就是保证所有行不全相同,即每一列都是不相同的! 7 如果每一列都不相同就是表示第j个同学(第j列)在这d天中不会和其他同学(列)在这d天中 都在同一辆车中! 8 9 思路:对于每一列我们枚举d天该学生所在的车号!它的下一列只保证有一个元素和它不同就行了!依次下去! 10 11