poj1950 Dessert(DFS)

题目链接

http://poj.org/problem?id=1950

题意

输入一个整数n(3<=n<=15),将1,2,..n顺序排列,在数字中间插入'+','-','.',这样会产生一个算数表达式,如果表达式的值为0,则输出该表达式。如果表达式为0的个数大于20,则只输出前20个。

思路

采用DFS搜索解决。由于数字的位置是固定的,所以在符号的位置上不断地尝试三种符号即可,若最终的表达式结果为0且是前20个表达式,则输出该表达式。

代码

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 
 6 const int N = 20;
 7 char str[N];
 8 int n;
 9 int nums;
10 int k;
11 
12 /*
13  * sum : 已求得的表达式的值
14  * pre : 当前位置pos的前一位置的值
15  * pos : 当前处理的数字,pos-1为符号插入的位置
16 */
17 void dfs(int sum, int pre, int pos)
18 {
19     if(pos==n+1)
20     {
21         if(sum==0)
22         {
23             nums++;
24             if(nums<=20)
25             {
26                 for(int i=1; i<n; i++)
27                     printf("%d %c ",i, str[i]);
28                 printf("%d\n", n);
29             }
30         }
31         return;
32     }
33 
34     str[pos-1] = '+';
35     dfs(sum+pos, pos, pos+1);
36 
37     str[pos-1] = '-';
38     dfs(sum-pos, -pos, pos+1);
39 
40     str[pos-1] = '.';
41     if(pos>=10)     //10.11=1011
42         k = 100;
43     else k = 10;    //1.2=12
44 
45     if(pre<0)
46         dfs(sum-pre+pre*k-pos, pre*k-pos, pos+1);
47     else if(pre>0)
48         dfs(sum-pre+pre*k+pos, pre*k+pos, pos+1);
49 }
50 
51 int main()
52 {
53     cin>>n;
54     nums = 0;
55     dfs(1, 1, 2);
56     cout<<nums<<endl;
57     return 0;
58 }

转载于:https://www.cnblogs.com/sench/p/7818427.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值