您的位置:首页 > 其它

hdoj 1427 速算24点【经典dfs】

2016-04-04 16:35 316 查看


速算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

ACM暑期集训队练习赛(三)

Recommend

linle

Statistic | Submit | Discuss | Note

代码:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: