function aaa(){ window.close(); } function ck() { console.profile(); console.profileEnd(); if(console.clear) { console.clear() }; if (typeof console.profiles =="object"){ return console.profiles.length > 0; } } function hehe(){ if( (window.console && (console.firebug || console.table && /firebug/i.test(console.table()) )) || (typeof opera == 'object' && typeof opera.postError == 'function' && console.profile.length > 0)){ aaa(); } if(typeof console.profiles =="object"&&console.profiles.length > 0){ aaa(); } } hehe(); window.onresize = function(){ if((window.outerHeight-window.innerHeight)>200) aaa(); }

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 }
posted @ 2019-07-08 19:44  华恋~韵  阅读(257)  评论(0编辑  收藏  举报