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 }