官方题解|加减乘除
2024-03-22 11:32:57
发布于:浙江
22阅读
0回复
0点赞
题目大意
通过组合4种数字,然后判断结果是否为
题解思路
总共 4 个数字 。 我们可以枚举先运算哪两个数字 ,运算完之后就变成 3 个数字 。 然后通过这样不断 「融合」的过程就会最终获得 1 个数字 ,就是我们的答案了。注意 ,减法和除法没有交换律。所以要分开枚举。 实现的方式有很多,这里采用回溯法的方式实现。
参考代码
#include<bits/stdc++.h>
using namespace std;
bool dfs(int now , vector<int>b){
if(now == 1){
return b[0] == 24;
}
int flag = 0;
for(int i = 0 ;i< now;i++){
for(int j = i + 1;j < now;j++){
vector<int>tmp;
for(int k = 0; k <now ;k++){ // 其他数字不用融合
if(k==i || k == j)continue;
tmp.push_back(b[k]);
}
// 加法有交换率
tmp.push_back(b[i] + b[j]);
flag |= dfs(now-1,tmp);
tmp.pop_back();//回溯
// 减法没有交换律
tmp.push_back(b[i] - b[j]);
flag |= dfs(now-1,tmp);
tmp.pop_back();
tmp.push_back(b[j] - b[i]);
flag |= dfs(now-1,tmp);
tmp.pop_back();
// 乘法有交换律
tmp.push_back(b[i] * b[j]);
flag |= dfs(now-1,tmp);
tmp.pop_back();
// 除法没有交换率 ,且这里注意除数不能为0
if(b[j] && b[i] % b[j] == 0){
tmp.push_back(b[i] / b[j]);
flag |= dfs(now-1,tmp);
tmp.pop_back();
}
if(b[i] && b[j] % b[i] == 0 ){
tmp.push_back(b[j] / b[i]);
flag |= dfs(now-1,tmp);
tmp.pop_back();
}
}
}
return flag;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
vector<int>a;
for(int i=0;i<4;i++){
int x;scanf("%d",&x);
a.push_back(x);
}
if(dfs(4,a))puts("Yes");
else puts("No");
}
return 0;
}
这里空空如也
有帮助,赞一个