把符号和数字排列都搞出来,然后算。。。
#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;
}