问题描述
一副牌54张,除去大小王,52张,抽出40张,计算最大积分。积分规则如下牌型比较和分数:同花顺6分>铁支5分>葫芦4分>同花3分>顺子2分>三条1分>两对1分>对子1分>散牌0分。6分,同花顺为同一种花色的顺子,比如全部是黑桃的A,K,Q,J,10。5分,铁支为四张同样大小的牌,比如4个A。4分,葫芦为三张一样的带2张一样的,比如3个A带2个8。3分,同花为五张牌为一种花式。2分,顺子为5张牌是顺子但不同花。1分,三条是指有三个牌点数一样,两对是指有两个对子,对子是指有一个对子。0分,散牌是没有上面说的任何情况。阅卷方法:写一个方法实现如上题目,方法接受一个string类型参数,会有统一的测试数据来调用这写的方法。测试数据的格式是:1,52,113,94,13...空格分隔每一张牌,逗号前的数字1234对应黑桃红桃梅花方块,总共40张牌。也就是40张牌分成8组,每组5张,然后计算总分一组当中有两个对子+一个散牌,也只能算为一个对子+一个散牌即计分1分
解决方案
解决方案二:
引用楼主xiaozhenqing的回复:
一副牌54张,除去大小王,52张,抽出40张,计算最大积分。积分规则如下牌型比较和分数:同花顺6分>铁支5分>葫芦4分>同花3分>顺子2分>三条1分>两对1分>对子1分>散牌0分。6分,同花顺为同一种花色的顺子,比如全部是黑桃的A,K,Q,J,10。5分,铁支为四张同样大小的牌,比如4个A。4分,葫芦为三张一样的带2张一样的,比如3个A带2个8。3分,同花为五张牌为一种花式。2分,顺子为5张牌是顺子但不同花。1分,三条是指有三个牌点数一样,两对是指有两个对子,对子是指有一个对子。0分,散牌是没有上面说的任何情况。阅卷方法:写一个方法实现如上题目,方法接受一个string类型参数,会有统一的测试数据来调用这写的方法。测试数据的格式是:1,52,113,94,13...空格分隔每一张牌,逗号前的数字1234对应黑桃红桃梅花方块,总共40张牌。也就是40张牌分成8组,每组5张,然后计算总分一组当中有两个对子+一个散牌,也只能算为一个对子+一个散牌即计分1分
也就是40张牌分成8组,每组5张,然后计算总分既然如此,不是很简单了吗,每次只计算一组的5张牌,而7种牌型都是5张的,按分值从高到低判断,直到判定是某种情况为止。一张牌有两个属性(花色和数值),用两个变量存储一张牌。先把传入的字符串用空格分割,得到牌的数量,每张牌可以用逗号分割,或者subString截取获得花色和数值属性。剩下的就是逻辑判断。排序、比较等等,简单,但很麻烦,比较蛋疼就是了。要注意细节
解决方案三:
1.流程应该是Dictionary<int,int>创建一个键值对的数值2.key放类型1234value放40张随机的牌3.利用循环放入52张牌,或者放入测试数据。4.利用循环+随机取出40张放入另一个Dictionary<int,int>集合中5.这里有2两选择将40张按序分成8组或者随机分成8组(注意匹配第二个Dictionary<int,int>集合是否是随机出的,且是否有相同的)6.写一个switch将对中情况罗列将其加分
解决方案四:
是最大总分,不是总分,这区别大了40张牌有C(40,5)*C(35,5)*C(30,5)*C(25,5)*C(20,5)*C(15,5)*C(10,5)种组合每种组合分值不同要求得最大的,遍历不太现实啊.这题目最关键就是找到一个算法,来确定应该优先选择哪种组合
解决方案五:
引用2楼qq_19920727的回复:
1.流程应该是Dictionary<int,int>创建一个键值对的数值2.key放类型1234value放40张随机的牌3.利用循环放入52张牌,或者放入测试数据。4.利用循环+随机取出40张放入另一个Dictionary<int,int>集合中5.这里有2两选择将40张按序分成8组或者随机分成8组(注意匹配第二个Dictionary<int,int>集合是否是随机出的,且是否有相同的)6.写一个switch将对中情况罗列将其加分
2.key放类型1234value放40张随机的牌我应该理解成:使用一个Dictionary存储一张牌吗?如果理解成一个Dictionary存储多张牌,key是花色,那就错了,因为key是不允许重复,而花色只有1、2、3、4,牌的花色是可以重复的。这个问题上,不应该使用Dictionary,而应该使用数组+类或者数组+结构。一个简单的类或者结构就好:classWord{privateintcolor;//花色privateintvalue;//牌面值}
解决方案六:
存放到哪里其实都好说牌是固定40张,完全可以放到数组里比如int[40][2]
解决方案七:
引用3楼Z65443344的回复:
是最大总分,不是总分,这区别大了40张牌有C(40,5)*C(35,5)*C(30,5)*C(25,5)*C(20,5)*C(15,5)*C(10,5)种组合每种组合分值不同要求得最大的,遍历不太现实啊.这题目最关键就是找到一个算法,来确定应该优先选择哪种组合
哥们想得有道理。只是仔细琢磨过一下题目,需求应该就是指定一种组合,然后计算而已,并不是自由组合。如果要求自由组合,找到一种最优组合,那就要使用深度优先搜索算法,并保存当前的积分,进行恰当的剪枝了。
解决方案八:
引用4楼zhi_ai_yaya的回复:
Quote: 引用2楼qq_19920727的回复:
1.流程应该是Dictionary<int,int>创建一个键值对的数值2.key放类型1234value放40张随机的牌3.利用循环放入52张牌,或者放入测试数据。4.利用循环+随机取出40张放入另一个Dictionary<int,int>集合中5.这里有2两选择将40张按序分成8组或者随机分成8组(注意匹配第二个Dictionary<int,int>集合是否是随机出的,且是否有相同的)6.写一个switch将对中情况罗列将其加分2.key放类型1234value放40张随机的牌我应该理解成:使用一个Dictionary存储一张牌吗?如果理解成一个Dictionary存储多张牌,key是花色,那就错了,因为key是不允许重复,而花色只有1、2、3、4,牌的花色是可以重复的。这个问题上,不应该使用Dictionary,而应该使用数组+类或者数组+结构。一个简单的类或者结构就好:classWord{privateintcolor;//花色privateintvalue;//牌面值}
哦对哦这倒是那如果这样呢Dictionary<int,int[]>d=newDictionary<int,int[]>();如果是固定测试数据的吧通过key存花色value存牌组这样貌似就好了
解决方案九:
引用7楼qq_19920727的回复:
哦对哦这倒是那如果这样呢Dictionary<int,int[]>d=newDictionary<int,int[]>();如果是固定测试数据的吧通过key存花色value存牌组这样貌似就好了
是可以的,但是这样可能会导致一些问题,比如int[]这个数组长度不一致,而且可能出现缺少某种花色,处理起来就比较麻烦啦!Dictionary是用于建立键-值映射的,这是一个字典功能,专门用于快速查找和映射。
解决方案十:
引用6楼zhi_ai_yaya的回复:
Quote: 引用3楼Z65443344的回复:
是最大总分,不是总分,这区别大了40张牌有C(40,5)*C(35,5)*C(30,5)*C(25,5)*C(20,5)*C(15,5)*C(10,5)种组合每种组合分值不同要求得最大的,遍历不太现实啊.这题目最关键就是找到一个算法,来确定应该优先选择哪种组合哥们想得有道理。只是仔细琢磨过一下题目,需求应该就是指定一种组合,然后计算而已,并不是自由组合。如果要求自由组合,找到一种最优组合,那就要使用深度优先搜索算法,并保存当前的积分,进行恰当的剪枝了。
这关键是以怎样的规则组合
解决方案十一:
引用9楼xiaozhenqing的回复:
Quote: 引用6楼zhi_ai_yaya的回复:
Quote: 引用3楼Z65443344的回复:
是最大总分,不是总分,这区别大了40张牌有C(40,5)*C(35,5)*C(30,5)*C(25,5)*C(20,5)*C(15,5)*C(10,5)种组合每种组合分值不同要求得最大的,遍历不太现实啊.这题目最关键就是找到一个算法,来确定应该优先选择哪种组合哥们想得有道理。只是仔细琢磨过一下题目,需求应该就是指定一种组合,然后计算而已,并不是自由组合。如果要求自由组合,找到一种最优组合,那就要使用深度优先搜索算法,并保存当前的积分,进行恰当的剪枝了。
这关键是以怎样的规则组合
这真要找一个最优解,很难啊!我能想到的一个寻找局部满意解的算法就是使用贪心算法:在40张牌中,先找一个最高分的5张组合;然后在剩下的35张牌中,再递归使用贪心算法。这样简单,而且能获得一个总分满意解。
解决方案十二:
引用10楼zhi_ai_yaya的回复:
Quote: 引用9楼xiaozhenqing的回复:
Quote: 引用6楼zhi_ai_yaya的回复:
Quote: 引用3楼Z65443344的回复:
是最大总分,不是总分,这区别大了40张牌有C(40,5)*C(35,5)*C(30,5)*C(25,5)*C(20,5)*C(15,5)*C(10,5)种组合每种组合分值不同要求得最大的,遍历不太现实啊.这题目最关键就是找到一个算法,来确定应该优先选择哪种组合哥们想得有道理。只是仔细琢磨过一下题目,需求应该就是指定一种组合,然后计算而已,并不是自由组合。如果要求自由组合,找到一种最优组合,那就要使用深度优先搜索算法,并保存当前的积分,进行恰当的剪枝了。
这关键是以怎样的规则组合
这真要找一个最优解,很难啊!我能想到的一个寻找局部满意解的算法就是使用贪心算法:在40张牌中,先找一个最高分的5张组合;然后在剩下的35张牌中,再递归使用贪心算法。这样简单,而且能获得一个总分满意解。
就怕一个同花顺破坏了5个铁支。。。好难啊
解决方案十三:
引用11楼u012948520的回复:
Quote: 引用10楼zhi_ai_yaya的回复:
Quote: 引用9楼xiaozhenqing的回复:
Quote: 引用6楼zhi_ai_yaya的回复:
Quote: 引用3楼Z65443344的回复:
是最大总分,不是总分,这区别大了40张牌有C(40,5)*C(35,5)*C(30,5)*C(25,5)*C(20,5)*C(15,5)*C(10,5)种组合每种组合分值不同要求得最大的,遍历不太现实啊.这题目最关键就是找到一个算法,来确定应该优先选择哪种组合哥们想得有道理。只是仔细琢磨过一下题目,需求应该就是指定一种组合,然后计算而已,并不是自由组合。如果要求自由组合,找到一种最优组合,那就要使用深度优先搜索算法,并保存当前的积分,进行恰当的剪枝了。
这关键是以怎样的规则组合
这真要找一个最优解,很难啊!我能想到的一个寻找局部满意解的算法就是使用贪心算法:在40张牌中,先找一个最高分的5张组合;然后在剩下的35张牌中,再递归使用贪心算法。这样简单,而且能获得一个总分满意解。
就怕一个同花顺破坏了5个铁支。。。好难啊
5个铁支就是5个同花顺了,那就4个铁支吧
解决方案十四:
1个同花顺+4葫芦,22分4个铁枝,20分如果破坏了之后都能形成葫芦,反而分值更高啊.反之如果不能形成葫芦,分值会降低.当然还跟剩余的牌到底能形成什么有关系.要找最优解,很难啊.遍历是保证可以,就是会超慢.情况太多了.
解决方案十五:
最大好像是8组同花顺2组金刚一个对子48+10+1=59分
解决方案:
引用13楼Z65443344的回复:
1个同花顺+4葫芦,22分4个铁枝,20分如果破坏了之后都能形成葫芦,反而分值更高啊.反之如果不能形成葫芦,分值会降低.当然还跟剩余的牌到底能形成什么有关系.要找最优解,很难啊.遍历是保证可以,就是会超慢.情况太多了.
如上面所言,一个简单的贪心算法就可以得到一个局部最优解、全局满意解,应该是最合理的解决方案了。
解决方案:
最可怕的是如果有AKQJ10同花顺,可能会破坏AAAA的铁枝而其实同时有KQJ109的同花顺,这个很难判断啊...