官方题解|加减乘除
2024-03-22 11:32:57
发布于:浙江
50阅读
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;
}
这里空空如也



有帮助,赞一个