算24点(c++)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int num[10];
bool visit[10];
struct Node{
int x,y,res;
char op;
}node[10];
void dfs(int deep){
// for(int i=1;i<=4;i++) printf("%d ",num[i]);
// printf("\n");
// for(int i=1;i<=4;i++) printf("%d ",int(visit[i]));
// printf("\n");
if(deep>=4){
// printf("1\n");
bool flag=false;
for(int i=1;i<=4;i++){
if(num[i]==24){
flag=true;
break;
}
}
if(flag){
for(int i=1;i<=3;i++) printf("%d%c%d=%d\n",node[i].x,node[i].op,node[i].y,node[i].res);
exit(0);
}
return ;
}
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
if(i==j||visit[i]||visit[j]||num[i]<num[j]||num[i]==0||num[j]==0) continue;
for(int op=1;op<=4;op++){
node[deep].x=num[i],node[deep].y=num[j];
// printf("i:%d j:%d deep:%d\n",i,j,deep);
switch(op){
case 1:num[i]=num[i]+num[j],visit[j]=true,node[deep].op='+',node[deep].res=num[i];dfs(deep+1);visit[j]=false,num[i]=num[i]-num[j];break;
case 2:num[i]=num[i]-num[j],visit[j]=true,node[deep].op='-',node[deep].res=num[i];dfs(deep+1);visit[j]=false,num[i]=num[i]+num[j];break;
case 3:num[i]=num[i]*num[j],visit[j]=true,node[deep].op='*',node[deep].res=num[i];dfs(deep+1);visit[j]=false,num[i]=num[i]/num[j];break;
case 4:if(num[i]%num[j]==0){num[i]=num[i]/num[j],visit[j]=true,node[deep].op='/',node[deep].res=num[i];dfs(deep+1);visit[j]=false,num[i]=num[i]*num[j];}break;
}
}
}
}
}
int main(){
// freopen("Poker.in","r",stdin);
// freopen("Poker.out","w",stdout);
scanf("%d %d %d %d",&num[1],&num[2],&num[3],&num[4]);
dfs(1);
printf("No answer!");
return 0;
}
更多推荐
所有评论(0)