题目描述
扑克牌24点大家都玩过,把一副扑克牌的大王小王去除,把A、J、Q、K当做1、11、12、13,抽取其中4张,通过任意顺序和次数的四则运算操作使得结果是24即可
位24点与普通24点的区别在于它在四则运算的基础上增加了三则位运算(位与,位或,位异或)其他规则不变
给定4张牌,请求得这四张牌是否能通过位24点得出24
(注意:本题的所有除法为整除运算,比如3/4的值为0)
输入
输入有多组样例,每个样例占一行,分别四张牌的牌面(A到K)
输入样例最多有10000组
输出
对于每组样例,输出一行,如果能算出24,则输出"yes",否则输出"no"。
样例输入 Copy
6 7 7 J
7 10 8 10
A A A A
3 3 3 3
样例输出 Copy
yes
yes
no
yes
- 要考虑所有9种情况情况, 包括a-b和b-a, a/b,b/a(分母要非0)
- 不能傻乎乎的按正常思路,因为没考虑完所有结果
- 思路是4张牌变成3张牌,3张牌变2张牌,。。最后判断最后一张是不是24
- 可以考虑一个A A A K,普通的搜索会报no,因为这4个数字单纯±*/算不出24
#include<bits/stdc++.h>
using namespace std;
#define INF 0xfffffff;
string str[5];
int k[5];
int vis[5];
int flag;
void dfs(int teep){
if(flag)return;
if(teep == 4){
for(int i = 1; i <= 4; i ++){
if(vis[i]==0 && k[i] == 24) flag = 1;
}
return;
}
for(int i = 1; i <= 4; i ++){
if(vis[i] == 1) continue;
vis[i] = 1;
for(int j = 1; j <= 4; j ++){
if(vis[j] == 1) continue;
int temp = k[j];
k[j] = k[i] + k[j]; dfs(teep + 1),k[j] = temp;
k[j] = k[i] - k[j]; dfs(teep + 1),k[j] = temp;
k[j] = k[j] - k[i]; dfs(teep + 1),k[j] = temp;
k[j] = k[i] * k[j]; dfs(teep + 1),k[j] = temp;
if(k[j]!=0)k[j] = k[i] / k[j];dfs(teep + 1),k[j] = temp;
if(k[i]!=0)k[j] = k[j] / k[i];dfs(teep + 1),k[j] = temp;
k[j] = k[i] | k[j]; dfs(teep + 1),k[j] = temp;
k[j] = k[i] & k[j]; dfs(teep + 1),k[j] = temp;
k[j] = k[i] ^ k[j]; dfs(teep + 1),k[j] = temp;
}
vis[i] = 0;
}
}
int main() {
//ios::sync_with_stdio(false);
while(cin >> str[1] >> str[2] >> str[3] >> str[4]){
memset(vis,0,sizeof(vis));
flag = 0;
for(int i = 1; i <= 4; i ++){
if(str[i] == "A")k[i] = 1;
else if(str[i] == "10")k[i] = 10;
else if(str[i] == "J")k[i] = 11;
else if(str[i] == "Q")k[i] = 12;
else if(str[i] == "K")k[i] = 13;
else k[i] = str[i][0] - '0';
}
dfs(1);
if(flag) cout << "yes" << endl;
else cout << "no" << endl;
}
return 0;
}