求调,不知道哪错了
  • 板块P1236 算24点
  • 楼主XYzero
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/11 20:07
  • 上次更新2023/11/11 21:33:53
查看原帖
求调,不知道哪错了
917025
XYzero楼主2023/11/11 20:07

把符号和数字排列都搞出来,然后算。。。

#include<bits/stdc++.h>
using namespace std;
int num[50][5];
char ji2[50][5];
bool flag[10];
int a[10],s[10],a2[10];
int tmp = 0,tmp2 = 0;
char ji[5] = {'j','+','-','*','/'};
int math(int a,int b,char tmp){
	if(tmp == '+'){
		return a + b;
	}
	else if(tmp == '-'){
		return abs(a - b);
	}
	else if(tmp == '*'){
		return a * b;
	}
	else {
		if(a % b != 0 || b == 0){
			return -114514;
		}
		else return a / b;
	}
}
int add(int a,int b){
	int ret = num[a][1];
    ret = math(ret,num[a][2],ji2[b][1]);
    ret = math(ret,num[a][3],ji2[b][2]);
    ret = math(ret,num[a][4],ji2[b][3]);
    return ret;
}
int add2(int a,int b){
	int ret = num[a][1];
	int ret2 = num[a][3];
    ret = math(ret,num[a][2],ji2[b][1]);
    ret2 = math(ret2,num[a][4],ji2[b][3]);
    return math(ret2,ret,ji2[b][2]);
}
void dfs(int t){//1
	if(t>4){
		tmp++;
	    for(int i = 1;i <= 4;i++){
	    	num[tmp][i] = s[a[i]];
		}
		return ;
	}
	for(int i=1;i<=4;i++)
	{
		if(flag[i] == 0){
		a[t] = i;
		flag[i] = 1;
		dfs(t + 1);
		flag[i] = 0;
		}
	}
}
void dfs2(int t){//2
	if(t>3){
		tmp2++;
	    for(int i = 1;i <= 3;i++){
	    	ji2[tmp2][i] = ji[a2[i]];
		}
		return ;
	}
	for(int i=1;i<=3;i++)
	{
		if(flag[i] == 0){
		a2[t] = i;
		flag[i] = 1;
		dfs2(t + 1);
		flag[i] = 0;
		}
	}
}
int main(){
	for(int i = 1;i <= 4;i++){
		cin >> s[i];
	}
	dfs(1);
	memset(flag,0,sizeof(flag));
	dfs2(1);
	bool flg = 0;
    for(int i = 1;i <= tmp;i++){
    	for(int j = 1;j <= tmp2;j++){
    		if(add(i,j) == 24){
    			int tmp = math(num[i][1],num[i][2],ji2[j][1]);
    			cout << max(num[i][1],num[i][2]) << ji2[j][1] << min(num[i][2],num[i][1]) << "=" << tmp << "\n";
    			cout << max(tmp,num[i][1]) << ji2[j][2] << min(tmp,num[i][1]) << "=" << math(tmp,num[i][3],ji2[j][2]) << "\n";
    			tmp = math(tmp,num[i][3],ji2[j][2]);
    			cout << max(tmp,num[i][4]) << ji2[j][3] << min(tmp,num[i][4]) << "=" << 24;
    			flg = 1;
    			break;
 			}
 			 if(add2(i,j) == 24){
 			 	
 				int tmp = math(num[i][1],num[i][2],ji2[j][1]);
 				int tmp2 =  math(num[i][3],num[i][4],ji2[j][3]);
    			cout << max(tmp,tmp2) << ji2[j][2] << min(tmp2,tmp)<< "=" << 24;
     			flg = 1;
    			break;
			}
 			if(flg)break;
		}
		if(flg)break;
	}
	if(!flg)cout << "No answer!";
	return 0;
	
}

2023/11/11 20:07
加载中...