hdoj 1427 速算24点 【经典 dfs 】
2015-11-13 13:28
369 查看
速算24点
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3904 Accepted Submission(s): 953
[align=left]Problem Description[/align]
速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断是否有解。我们另外规定,整个计算过程中都不能出现小数。
[align=left]Input[/align]
每组输入数据占一行,给定四张牌。
[align=left]Output[/align]
每一组输入数据对应一行输出。如果有解则输出"Yes",无解则输出"No"。
[align=left]Sample Input[/align]
A 2 3 6 3 3 8 8
[align=left]Sample Output[/align]
Yes No
思路:用数组存储4个给定的数和给定的数之间的运算结果,每次操作都取没有使用过的两个数运算, 注意除法时不能出现小数。
代码:
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; struct record { int x,sum; }; int vis[10];//标记数字是否使用过 int a[10];//存储4个数字及数字之间运算的结果 char c[4][2]; int dfs(int u,int t)//u已使用的数字,t存储的数字和结果的个数 { int i,j; if(u==4)//已经使用了4个数字; { if(a[t-1]==24) return 1; else return 0; } for(i=0;i<t-1;i++) { if(vis[i]) continue; vis[i]=1; for(j=i+1;j<t;j++) { if(vis[j]) continue; vis[j]=1; a[t]=a[i]+a[j]; if(dfs(u+1,t+1)) return 1; a[t]=a[i]-a[j]; if(dfs(u+1,t+1)) return 1; a[t]=a[j]-a[i]; if(dfs(u+1,t+1)) return 1; a[t]=a[i]*a[j]; if(dfs(u+1,t+1)) return 1; if(a[j]) { if(a[i]%a[j]==0) a[t]=a[i]/a[j]; if(dfs(u+1,t+1)) return 1; } if(a[i]) { if(a[j]%a[i]==0) a[t]=a[j]/a[i]; if(dfs(u+1,t+1)) return 1; } vis[j]=0;//去标记 } vis[i]=0;//去标记 } return 0; } int main() { int i; while(~scanf("%s%s%s%s",&c[0],&c[1],&c[2],&c[3])) { for(i=0;i<4;i++) { if(strlen(c[i])>1) a[i]=10; else { if(c[i][0]=='A') a[i]=1; else if(c[i][0]=='J') a[i]=11; else if(c[i][0]=='Q') a[i]=12; else if(c[i][0]=='K') a[i]=13; else a[i]=c[i][0]-'0'; } } memset(vis,0,sizeof(vis)); if(dfs(1,4)) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- int2byte
- Python基础(一)
- 内存泄漏检
- live555改多线程
- Oracle用户、权限、角色管理
- python 读取utf8文件
- 灰度图像阈值化分割常见方法总结及VC实现
- linux IP 设置
- 笔记本在机械硬盘的基础上新加装固态硬盘(SSD)方法!
- Office 2003: 使用Excel去除重复数据
- jquery selectboxit 选项框使用
- 各种排序算法的分析及java实现
- 魅族SDK接入
- idea 编程实用快捷键
- mysql,sql的Java连接方法(简单应用)执行sql查询与预处理
- 直接添加json文件里面的所有配置信息
- html 表格
- bitmap图片转换成JPG图片
- centeros 下安装crash kdump
- android 小谈activity的四种启动模式