http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2144
写一个程序要求当输入在整数范围内的一个整数R后, 计算机便会检查,在下式□处能否填上“+”、“-”或“×”号凑成相应等式。如能凑成,则印出所有这些等式的个数。注意,考虑符号的优先级。 1□2□3□4□5□6□7□8□9=R
Input
只有一行,就是一个整数R。
Output
只有一行,就是使等式成立的个数。
Sample Input
20
Sample Output
30
思路:DFS搜索喽,判断所有情况,当已经选好了8个运算符的时候,计算整个表达式的值,如果成立的话,就令cnt自增。具体过程看代码吧。这里解释一下怎么计算表达式的值,因为只有加法、减法、乘法,乘法的优先级自然是最高的,假设用f[i]表示第i个数和第i+1个数之间的运算符,a[i]表示第i个数,我们先倒着扫一遍f[i],看当前情况有没有乘法,如果有的话,就先把结果算除法,即令a[i]=a[i]*a[i+1],a[i+1]=0,然后再正着扫一遍算加法或减法,这时候跳过等于0的数即可。运算符的设置请看代码注释。
#include<iostream>
#include<cstdio>
#include<stack>
#include<cmath>
#include<cstring>
#include<queue>
#include<set>
#include<algorithm>
#include<iterator>
#define INF 0x3f3f3f3f
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int a[10];
int f[15]; //+ 1 - 2 * 3
int cnt=0;
int r;
void solve(int cur);
int main()
{
scanf("%d",&r);
for(int i=1;i<=9;i++)
a[i]=i;
solve(1);
printf("%d\n",cnt);
return 0;
}
void solve(int cur)
{
if(cur>=9)
{
for(int i=8;i>=1;i--)
{
if(f[i]==3)
{
a[i]=a[i]*a[i+1];
a[i+1]=0;
}
}
int pre=a[1];
for(int i=1;i<=8;i++)
{
if(!a[i+1])
continue;
if(f[i]==1)
pre+=a[i+1];
else if(f[i]==2)
pre-=a[i+1];
}
if(pre==r)
cnt++;
for(int i=1;i<=9;i++)
a[i]=i;
return ;
}
for(int i=1;i<=3;i++)
{
f[cur]=i;
solve(cur+1);
}
}