Description
写一个程序要求当输入在整数范围内的一个整数R后, 计算机便会检查,在下式□处能否填上“+”、“-”或“×”号凑成相应等式。如能凑成,则印出所有这些等式的个数。注意,考虑符号的优先级。 1□2□3□4□5□6□7□8□9=R
Input
只有一行,就是一个整数R。
Output
只有一行,就是使等式成立的个数。
Sample Input
20
Sample Output
30
Hint
思路:dfs,查找所有可能的情况。最后利用堆栈计算表达式
#include<cstdio>
#include<string.h>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<set>
#include<algorithm>
using namespace std;
int R;
int op[10]; //0,1,2分别代表+,-,*
int cnt;
void dfs(int i)
{
if (i == 9)
{
int sum = 0;
int tmp = 1;
stack<int> s;
s.push(1);
for (int i = 1; i <= 8; i++)
{
if (op[i] == 0)
s.push(i + 1);
else if (op[i] == 1)
s.push(-(i + 1));
else if (op[i] == 2)
{
int t = s.top();
s.pop();
s.push(t * (i + 1));
}
}
while (!s.empty())
{
sum += s.top();
//printf("%d ", s.top());
s.pop();
}
//printf("\n");
if (sum == R)
{
// for (int i = 1; i <= 8; i++)
// printf("%d ", op[i]);
// printf("sum=%d\n", sum);
cnt++;
}
return;
}
for (int j = 0; j < 3; j++)
{
op[i] = j;
dfs(i + 1);
}
}
int main()
{
scanf("%d", &R);
cnt = 0;
memset(op, -1, sizeof(op));
dfs(1);
printf("%d\n", cnt);
return 0;
}