CSU暑期集训day06_平衡等式

题目:

写一个程序要求当输入在整数范围内的一个整数R后, 计算机便会检查,在下式□处能否填上“+”、“-”或“×”号凑成相应等式。如能凑成,则印出所有这些等式的个数。注意,考虑符号的优先级。 1□2□3□4□5□6□7□8□9=R

Input

只有一行,就是一个整数R。

Output

只有一行,就是使等式成立的个数。

Sample Input

20

Sample Output

30

解题思路:

    遍历每一个位置可以放的符号的所有情况,计算表达式的值,如果和R相同就计数。

代码:

#include <iostream>

using namespace std;

int r;
int fu[10];
int num[10];
int answ;

bool check(){
    int ans=0;
    for(int i=1;i<=9;i++){
        if(!fu[i]){
            int beg=i-1;
            while(!fu[i]){
                num[i-1]=0;
                num[i]=0;
                i++;
                if(i>9)break;
            }
            int cur=1;
            for(int j=beg;j<=i-1;j++)cur=cur*j;
            ans=ans+cur*fu[beg];
        }
    }
    for(int i=1;i<=9;i++){
        if(num[i])ans=ans+num[i]*fu[i];
    }
    for(int i=1;i<=9;i++)num[i]=i;
    if(ans==r)return true;
    else return false;
}

void f(int a,int x){    
    fu[a]=x;
    if(a==9){
        if(check())answ++;
    }else{        
        f(a+1,1);
        f(a+1,0);
        f(a+1,-1);
    }
}

int main(){    
    while(scanf("%d",&r)!=0){
        for(int i=1;i<10;i++)num[i]=i;
        answ=0;
        f(1,1);
        cout<<answ<<endl; 
    }
    return 0;

猜你喜欢

转载自blog.csdn.net/weixin_42774699/article/details/81270900