题目大意:类似于24点,给数字和目标数,通过四则运算求得目标数,输出式子。此题中,运算符没有优先级,遵循从左至右运算;除号在能够整除的时候才能用;运算过程数字要在 -32000~32000 范围内。
解题思路:dfs + 判重
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
using namespace std;
int num[110], op[110], vis[110][64010];
int cas, p, targe, flag;
void dfs(int now, int sum) {
int tmp;
if (now == p && sum == targe) flag = 1;
if (flag || now == p || abs(sum) > 32000) return;
for (int i = 1; i <= 4; i++) {
op[now-1] = i;
if (i == 1) tmp = sum + num[now];
if (i == 2) tmp = sum - num[now];
if (i == 3) tmp = sum * num[now];
if (i == 4 && num[now] && (sum % num[now] == 0)) tmp = sum / num[now];
if (abs(tmp) <= 32000 && !vis[now-1][tmp]) {
vis[now-1][tmp] = 1;
dfs(now+1, tmp);
}
if (flag) return;
}
}
int main() {
scanf("%d", &cas);
while (cas--) {
memset(vis, 0, sizeof(vis));
scanf("%d", &p);
for (int i = 0; i < p; i++)
scanf("%d", &num[i]);
scanf("%d", &targe);
flag = 0;
dfs(1, num[0]);
if (flag) {
for (int i = 0; i < p-1; i++) {
printf("%d", num[i]);
if (op[i] == 1) printf("+");
if (op[i] == 2) printf("-");
if (op[i] == 3) printf("*");
if (op[i] == 4) printf("/");
}
printf("%d=%d\n", num[p-1], targe);
}
else printf("NO EXPRESSION\n");
}
return 0;
}