速算24点
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4240 Accepted Submission(s): 1042
Problem Description
速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断是否有解。我们另外规定,整个计算过程中都不能出现小数。
Input
每组输入数据占一行,给定四张牌。
Output
每一组输入数据对应一行输出。如果有解则输出"Yes",无解则输出"No"。
Sample Input
A 2 3 6 3 3 8 8
Sample Output
Yes No
Author
LL
Source
Recommend
linle
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
char a[5][5];
int num[10];
int vis[10];
int bian(char a)
{
if(a=='A') return 1;
else if(a=='J') return 11;
else if(a=='Q') return 12;
else if(a=='K') return 13;
else return a-'0';
}
int dfs(int use,int tot)
{
if(use==4)
{
if(num[tot-1]==24)
{
return 1;
}
else
{
return 0;
}
}
for(int i=0;i<tot-1;i++)
{
if(vis[i]) continue;
vis[i]=1;
for(int j=i+1;j<tot;j++)
{
if(vis[j]) continue;
vis[j]=1;
num[tot]=num[i]+num[j];if(dfs(use+1,tot+1)) return 1;
num[tot]=num[i]-num[j];if(dfs(use+1,tot+1)) return 1;
num[tot]=num[j]-num[i];if(dfs(use+1,tot+1)) return 1;
num[tot]=num[i]*num[j];if(dfs(use+1,tot+1)) return 1;
if(num[j])
{
if(num[i]%num[j]==0)
{
num[tot]=num[i]/num[j];if(dfs(use+1,tot+1)) return 1;
}
}
if(num[i])
{
if(num[j]%num[i]==0)
{
num[tot]=num[j]/num[i];if(dfs(use+1,tot+1)) return 1;
}
}
vis[j]=0;
}
vis[i]=0;
}
return 0;
}
int main()
{
while(scanf("%s%s%s%s",&a[0],&a[1],&a[2],&a[3])!=EOF)
{
for(int i=0;i<4;i++)
{
if(strlen(a[i])==2)
{
num[i]=10;
}
else
{
num[i]=bian(a[i][0]);
}
}
memset(vis,0,sizeof(vis));
if(dfs(1,4))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}