查看: 3013| 回复: 23
跳转到指定楼层
上一主题 下一主题
收起左侧

求解:出牌算法

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 zyp911 于 2013-9-24 16:39 编辑

1.
有一手扑克,最多14张(1-14),不考虑花色升序排列
例如: 1 1 1 1 2 3 4 5 6 7 8 8 9 9

可以出对子 例如:11
可以出顺子(最多3张) 例如:345
可以出豹子 例如 111
可以出炸弹 例如 1111

判断这样一手牌
是否可以一次顺序出完?

2.
上面题目加一个条件
1 可以 替代其他任何数字
判断是否可以一次性出完






上一篇:求解:字符串解析
下一篇:股票买入卖出问题
🔗
KevinFromJail 2013-9-24 16:04:55 | 只看该作者
全局:
直接搜索做个回溯?14张牌也不是很多.
2——A 记为 0-12,vector<int> cardRecords记录每种牌的数量

bool judgeCards(vector<int> cardRecords)
{
        int minIndex = -1;
        for(int i = 0; i < cardRecords.size(); i ++)
        {
                if(cardRecords[i] > 0)
                {
                        minIndex = i;
                        break;
                }
        }
        if(minIndex == -1)
        {
                return true;
        }
        else
        {
                if (cardRecords[minIndex] >= 2)
                {
                        cardRecords[minIndex] -= 2;
                        if (judgeCards(cardRecords))
                        {
                                return true;
                        }
                        cardRecords[minIndex] += 2;
                }
                if (cardRecords[minIndex] >= 3)
                {
                        cardRecords[minIndex] -= 3;
                        if (judgeCards(cardRecords))
                        {
                                return true;
                        }
                        cardRecords[minIndex] += 3;
                }
                if (minIndex <= 11 && cardRecords[minIndex] &&  cardRecords[minIndex+1]&& cardRecords[minIndex + 2])
                {
                        cardRecords[minIndex] --;
                        cardRecords[minIndex+1] --;
                        cardRecords[minIndex + 2] --;
                        if (judgeCards(cardRecords))
                        {
                                return true;
                        }
                        cardRecords[minIndex] ++;
                        cardRecords[minIndex+1] ++;
                        cardRecords[minIndex + 2] ++;
                }
                return false;
        }
}
回复

使用道具 举报

🔗
 楼主| zyp911 2013-9-24 16:15:57 | 只看该作者
全局:
KevinFromJail 发表于 2013-9-24 16:04
直接搜索做个回溯?14张牌也不是很多.
2——A 记为 0-12,vector cardRecords记录每种牌的数量

不好意思
有两个条件没说清楚

1. 牌面已经升序排列好
2. 只能按顺序出牌(从低位到高位)
回复

使用道具 举报

🔗
KevinFromJail 2013-9-24 16:18:00 | 只看该作者
全局:
zyp911 发表于 2013-9-24 16:15
不好意思
有两个条件没说清楚

感觉不冲突啊 我就是从低到高搜索的...输入转化一下就行了
回复

使用道具 举报

🔗
KevinFromJail 2013-9-24 16:19:12 | 只看该作者
全局:
zyp911 发表于 2013-9-24 16:15
不好意思
有两个条件没说清楚

而且我不是太明白 出牌的顺序有关系吗....能不能给个出牌顺序违规其他条件满足的例子
回复

使用道具 举报

🔗
 楼主| zyp911 2013-9-24 16:25:51 | 只看该作者
全局:
KevinFromJail 发表于 2013-9-24 16:19
而且我不是太明白 出牌的顺序有关系吗....能不能给个出牌顺序违规其他条件满足的例子

非常感谢

我是突然想到这两点条件

我再仔细看看你给出的算法
回复

使用道具 举报

🔗
 楼主| zyp911 2013-9-24 18:28:56 | 只看该作者
全局:
KevinFromJail 发表于 2013-9-24 16:04
直接搜索做个回溯?14张牌也不是很多.
2——A 记为 0-12,vector cardRecords记录每种牌的数量

有些判断不太明白,cardRecords[minIndex] >= 2  ???

怎么确定的,14张全部出完?
回复

使用道具 举报

🔗
KevinFromJail 2013-9-24 20:26:31 | 只看该作者
全局:
zyp911 发表于 2013-9-24 18:28
有些判断不太明白,cardRecords[minIndex] >= 2  ???

怎么确定的,14张全部出完?

cardRecords[minIndex] >= 2 就是剩下的牌中最小的牌至少有两张相同的。
递归的过程中 计数的数组会不停减小的,当满足
if(minIndex == -1)
{
      return true;
}
时,说明已经出完了,则有解
回复

使用道具 举报

🔗
 楼主| zyp911 2013-9-24 20:51:34 | 只看该作者
全局:
KevinFromJail 发表于 2013-9-24 20:26
cardRecords[minIndex] >= 2 就是剩下的牌中最小的牌至少有两张相同的。
递归的过程中 计数的数组会不停 ...

不好意思 vector<int> cardRecords记录每种牌的数量?这个怎么意思?

还是不太明白您是怎么比较的

您能说明如何判断的对子,顺子,豹子,炸弹的吗?

回复

使用道具 举报

🔗
KevinFromJail 2013-9-24 21:55:07 | 只看该作者
全局:
zyp911 发表于 2013-9-24 20:51
不好意思 vector cardRecords记录每种牌的数量?这个怎么意思?

还是不太明白您是怎么比较的

我感觉你不是太了解回溯....这个三言两语也很难讲清楚。
举个例子, 手里的牌是2 2 2 3 4 5,那这时cardRecords里面 [0] = 3 ,[1] = 1 ,[2] = 1 ,[3] = 1
[0] = 3 >= 2(3张2),那么先尝试拿出一对2,[0] -= 2 变成1,再判断剩下的牌能不能出完
判断完以后,回复[0] = 3 再尝试拿出3张2,[0] -= 3变成0, 再判断剩下的牌能不能出完
再回复,再判断以2开头的顺子牌,以此类推。
炸弹是不用判断的,出两对是等效的。

本质这个算法就是暴力地搜索了所有可能的情况,不知道有没有更好的解法。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表