一道坑爹的选牌题目

来源:互联网 发布:网络发行许可证 编辑:程序博客网 时间: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下,当然数据规模大的时候剪枝是必要的,这里不做了因为本身是个填答案题。。。暂时没想到更简单的办法

顺带希望以后写博客频繁点。。。这第一篇写完都多久了。。才写第二篇。。。

1 0