一道坑爹的选牌题目
来源:互联网 发布:网络发行许可证 编辑:程序博客网 时间:2024/06/06 02:06
题目描述:
一天,小A和小B在箱子找玩具。
他们在箱子的深处发现了一些扑克牌,他们把扑克牌都拿了出来数了数,发现已经凑不成一副扑克了。
A,2,4,5,6,7,8,9分别有3,3,3,2,1,3,3,2张,其他的都一张都没有。
他们决定拿这些扑克做一个游戏:
他们两人轮流(从小A开始)从这些扑克中拿一张出来,然后计算所有拿出来的扑克上数的和(A当做1来计算)。
让一人拿完计算的和达到50或者50以上就算这个人输。
小A和小B都绝顶聪明(每一次都以最优的拿法拿),最后小A获得了胜利。
请您写出小A第一次拿的数字为几的扑克牌。
写完代码把自己给绕进去了,然后问学长,顺带着把学长也给绕进去了。。。想了好久才想通。。。
为了解释,给个小点的数:5(达到5时算输)
import java.util.*;public class Main {static int a[]={0,3,3,0,3,2,1,3,3,2};static int sum,d;static int dfs(){if(sum>4)return 0;int res=0;for(int i=1;i<=9;i++){ if(a[i]>0){a[i]--;sum+=i;d++;int t=dfs();res|=t;System.out.println("d:"+d+" "+i+" sum:"+sum+" res:"+res);sum-=i;a[i]++;d--;}if(res==1) return 0;}return 1;} public static void main(String[] args){ for(int i=1;i<=9;i++){ d=0; sum=0; if(a[i]>0){ System.out.println("----"); a[i]--; sum+=i; d++; if(dfs()==1){System.out.println("answer:"+i);} a[i]++; sum-=i; d--; } } }}半天没想明白的原因是理解错了dfs()返回值的意思,我原来理解为,抽掉一张牌后,剩下这堆牌的胜负情况,因此便陷入了思维黑洞。。。
其实真正的含义应该是第一个抽牌的人的胜负情况。
下面是运行情况:
----
d:4 2 sum:5 res:0
d:4 4 sum:7 res:0
d:4 5 sum:8 res:0
d:4 6 sum:9 res:0
d:4 7 sum:10 res:0
d:4 8 sum:11 res:0
d:4 9 sum:12 res:0
d:3 1 sum:3 res:1
d:2 1 sum:2 res:0
d:4 1 sum:5 res:0
d:4 2 sum:6 res:0
d:4 4 sum:8 res:0
d:4 5 sum:9 res:0
d:4 6 sum:10 res:0
d:4 7 sum:11 res:0
d:4 8 sum:12 res:0
d:4 9 sum:13 res:0
d:3 1 sum:4 res:1
d:2 2 sum:3 res:0
d:2 4 sum:5 res:0
d:2 5 sum:6 res:0
d:2 6 sum:7 res:0
d:2 7 sum:8 res:0
d:2 8 sum:9 res:0
d:2 9 sum:10 res:0
answer:1
----
d:4 1 sum:5 res:0
d:4 2 sum:6 res:0
d:4 4 sum:8 res:0
d:4 5 sum:9 res:0
d:4 6 sum:10 res:0
d:4 7 sum:11 res:0
d:4 8 sum:12 res:0
d:4 9 sum:13 res:0
d:3 1 sum:4 res:1
d:2 1 sum:3 res:0
d:3 1 sum:5 res:0
d:3 2 sum:6 res:0
d:3 4 sum:8 res:0
d:3 5 sum:9 res:0
d:3 6 sum:10 res:0
d:3 7 sum:11 res:0
d:3 8 sum:12 res:0
d:3 9 sum:13 res:0
d:2 2 sum:4 res:1
----
d:2 1 sum:5 res:0
d:2 2 sum:6 res:0
d:2 4 sum:8 res:0
d:2 5 sum:9 res:0
d:2 6 sum:10 res:0
d:2 7 sum:11 res:0
d:2 8 sum:12 res:0
d:2 9 sum:13 res:0
answer:4
可以看到只有当d是奇数时,res为1,先抽牌的才能赢,因为先抽牌的就是奇数顺序抽牌,而一旦在搜索中出现有偶数d,res为1,则先抽者无法赢。
看了这个运行结果就明白return的其实并不是剩下这堆牌的胜负,而是当前轮次抽牌者的胜负。
感觉这题很绕,故特意来mark下,当然数据规模大的时候剪枝是必要的,这里不做了因为本身是个填答案题。。。暂时没想到更简单的办法
顺带希望以后写博客频繁点。。。这第一篇写完都多久了。。才写第二篇。。。
- 一道坑爹的选牌题目
- 一道超级坑爹的题目
- 一道有趣的题目
- 一道用递规做的题目
- 经典的一道题目.
- 笔试的一道题目
- 一道题目的解答
- 一道小学的题目
- 一道猥琐的题目
- 爱因斯坦的一道题目
- 一道有趣的题目
- 一道简单的题目
- 一道有意思的题目
- 一道有趣的题目
- 一道题目想到的
- 一道约瑟夫的题目
- 一道简单的题目
- 一道stack的题目
- 使用FileUpload组件完成文件下载
- [js]悬浮显示二级菜单的实现
- Git 学习笔记
- 类与类关系的UML图与代码表现
- yum找不到安装包
- 一道坑爹的选牌题目
- 基础sql语句总结(mysql)
- 【NOI2014】数学题(math)
- 快速排序
- PAT1070结绳
- 共享内存
- Python核心编程---读书笔记:第4章 Python对象
- mybatis事务
- 【C++】面向对象类成员函数的重载、覆盖与隐藏