Pku1950【Dessert】

描述

  John奶牛排队进餐制定了新的规定。N (3 <= N <= 15) 头奶牛不仅要按秩序站成一排,而且要每两头牛之间间隔一张标有符号"+"、"-"、或"."的餐巾纸。为了获得甜点,奶牛数字和餐巾纸上的符号组成的算式要得到结果0。标有符号"." 的餐巾纸使得奶牛能够得到更大的数字,例如以下算式:
1 - 2 . 3 - 4 . 5 + 6 . 7
它表示1-23-45+67,结果是0。

题目

你的任务是帮助奶牛获得甜点。

 

输入输出格式

 

输入

仅一个整数N.

输出

每行一个输出前20组可行解的算术表达式。
最后一行输出解的总数。
输出顺序依照字典顺序:"+"最前,"-"其次,"."最后。
如果解的总数小于20,要么输出所有可行解表达式。

 

输入输出样例

 

输入样例1

 

7

 

输出样例1

1 + 2 - 3 + 4 - 5 - 6 + 7
1 + 2 - 3 - 4 + 5 + 6 - 7
1 - 2 + 3 + 4 - 5 + 6 - 7
1 - 2 - 3 - 4 - 5 + 6 + 7
1 - 2 . 3 + 4 + 5 + 6 + 7
1 - 2 . 3 - 4 . 5 + 6 . 7
6

解题思路

  与等式差不多,只需要改改变量,两位数再特判就行。

题解

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,ans=0; 
 4 bool flag;
 5 int num[50];//0没有,1加法,2减法 
 6 void dfs(int sum)
 7 {
 8     if(sum==n+1)
 9     {
10         int q=0,p=0;
11         for(int qwe=1;qwe<=n;)
12         {
13             if(num[qwe]==1)flag=true;
14             if(num[qwe]==2)flag=false;
15             p=qwe;
16             qwe++;
17             while(num[qwe]==0&&qwe<=n)
18             {
19                 if(qwe<=9)p=p*10+qwe;
20                 else p=p*100+qwe;//两位数特判,要乘100 
21                 qwe++;
22             }
23             if(flag)
24             {
25                 q+=p;
26             }
27             else q-=p;
28         }
29         if(q==0)
30         {
31             ans++;  
32             if(ans<=20)
33             {
34                 cout<<1;
35                 for(int i=2;i<=n;i++)//输出 
36                 {
37                     if(num[i]==1)cout<<" + ";
38                     else if(num[i]==2)cout<<" - ";
39                     else if(num[i]==0)cout<<" . ";
40                     cout<<i;
41                 }
42                 cout<<endl;
43             }
44              
45         }
46         return;
47     } 
48     num[sum]=1;//搜索 
49     dfs(sum+1);
50     num[sum]=2;
51     dfs(sum+1);
52     num[sum]=0;
53     dfs(sum+1);
54 }
55 int main()
56 {
57     cin>>n;
58     num[1]=1;
59     dfs(2);
60     cout<<ans;
61     return 0; 
62 }

转载于:https://www.cnblogs.com/hualian/p/11153335.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值