题意:
方法一:
全排列函数+递归
思路:暴力枚举。
输入4张牌,如果存在大王小王,则输出ERROR。
对4张牌的进行全排列,并递归加减乘除的全排列;最后,判断结果是否等于24。如果存在至少一个4张牌和加减乘除的序列等于24,则输出该序列;否则,输出NONE。
#include <bits/stdc++.h> using namespace std; unordered_map<string,int> mp; string a[4]; char b[4]; char c[]={'+','-','*','/'}; int cal(int x,int y,char op){//加减乘除计算 switch(op){ case '+':return x+y; case '-':return x-y; case '*':return x*y; case '/':return x/y; } return 0; } int check(int x){//递归加减乘除的全排列 if(x==4){ int y=0; for(int i=0;i<4;i++){ y=cal(y,mp[a[i]],b[i]); } if(y==24)//如果等于24,则返回成功 return 1; else return 0; } for(int i=0;i<4;i++){//枚举四种运算符 b[x]=c[i]; if(check(x+1)) return 1; } return 0; } int main(){ for(int i=2;i<=10;i++)//初始化 mp[to_string(i)]=i; mp["A"]=1; mp["J"]=11; mp["Q"]=12; mp["K"]=13; int flag=0; b[0]='+'; for(int i=0;i<4;i++){//如果存在大王小王,则输出ERROR cin >> a[i]; if(a[i]=="joker"||a[i]=="JOKER"){ flag=1; } } if(flag==1){ cout << "ERROR\n"; return 0; } //4张牌的全排列 sort(a,a+4); do{ if(check(1)){//如果满足条件,则输出第一个计算式 cout << a[0]; for(int i=1;i<4;i++) cout << b[i] << a[i]; return 0; } }while(next_permutation(a,a+4)); cout << "NONE\n";//都不满足条件,则输出NONE return 0; }
时间复杂度:空间复杂度:
方法二:
递归
思路:与方法一思路一致。
但不用next_permutation函数,而是通过dfs对4张牌的进行全排列。
#include <bits/stdc++.h> using namespace std; unordered_map<string,int> mp; string a[4]; char b[4]; char c[]={'+','-','*','/'}; string d[4]; int vis[4]; int f=0;//判断是否找到解 int cal(int x,int y,char op){//加减乘除计算 switch(op){ case '+':return x+y; case '-':return x-y; case '*':return x*y; case '/':return x/y; } return 0; } int check(int x){//递归加减乘除的全排列 if(x==4){ int y=0; for(int i=0;i<4;i++){ y=cal(y,mp[d[i]],b[i]); } if(y==24)//如果等于24,则返回成功 return 1; else return 0; } for(int i=0;i<4;i++){//枚举四种运算符 b[x]=c[i]; if(check(x+1)) return 1; } return 0; } //4张牌的全排列 void dfs(int x){ if(x==4){ if(check(1)){//如果满足条件,则输出第一个计算式 cout << d[0]; for(int i=1;i<4;i++) cout << b[i] << d[i]; f=1; } return; } for(int i=0;i<4;i++){ if(vis[i]==0){//如果未访问,则访问 vis[i]=1; d[x]=a[i]; dfs(x+1); if(f==1)//剪枝 return; vis[i]=0; } } } int main(){ for(int i=2;i<=10;i++)//初始化 mp[to_string(i)]=i; mp["A"]=1; mp["J"]=11; mp["Q"]=12; mp["K"]=13; int flag=0; b[0]='+'; for(int i=0;i<4;i++){//如果存在大王小王,则输出ERROR cin >> a[i]; if(a[i]=="joker"||a[i]=="JOKER"){ flag=1; } } if(flag==1){ cout << "ERROR\n"; return 0; } //4张牌的全排列 dfs(0); if(f==0) cout << "NONE\n";//都不满足条件,则输出NONE return 0; }
时间复杂度:空间复杂度: