zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    setjmp()和longjmp()函数
    C语言过程活动记录
    【剑指Offer】字符串的排列
    python剑指offer系列二叉树中和为某一值的路径
    二叉搜索树的后续遍历
    如何设置学习率
    各种机器学习算法的优缺点(未完成)
    机器学习中梯度下降法和牛顿法的比较
    特征图大小的计算
    为什么L1稀疏,L2平滑?
  • 原文地址:https://www.cnblogs.com/hualian/p/11153335.html
Copyright © 2011-2022 走看看