A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

其实上一个贴子是给这个问题作铺垫的。想设计一个扑克游戏,需要实现这个目的,说下我的想法,十一暂且休息下,过两天贴代码。

首先也是冒泡排序+判断是否重复。只不过为了方便删除数字,采用集合num存储这6个数字。
5个数字和6个数字的区别在于6个数字可以允许有一个组重复的数字。但是重复的数字达到两组(比如3个一样的,或者2个对子)就必然不存在5个连续数字了。也就是将原来的bool类型的flag2改为int类型的flag2,初值为0,每次检测到重复的数字将flag2自加1,当flag2==2的时候就可以确认不存在5个连续的数字,直接跳出整个冒泡排序。
但是由于同一组重复的数字再冒泡排序的外层循环进行下一次的时候,还有可能会检测一次。所以,检测到重复数字的时候要删掉(其实不能完全删掉,因为扑克涉及到花色的问题和最后手牌保留的问题,所有这个删掉的数字还要保留备份)。这样可以保证不会让一组重复的数字连续增加flag2的值。

如果重复的数字只有一组。那比较简单,直接用集合最后一个元素减第一个元素判断是否为4即可(重复的元素被删掉了,所以最后一个元素下标为4)

如果没有重复的数字,那么存在5个连续数字包括以下两种情况
①前五个连续  num[4]-num[0]==4
②后五个连续  num[5]-num[1]==4
当然,六个数字均连续既符合情况①,也符合情况②,所以没必要拿出来独立讨论。
情况①和情况②有一个成立则存在5个数字连续,所以上面两个判断取逻辑或运算。

以上就是我关于这个问题算法实现的全部。大家还有什么别的方法么?

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

13 个回复

正序浏览
猫咪不吃糖 发表于 2013-10-17 18:24
中间断开就重置为1了。

哦,我愚笨了,没看到,不好意思,恩,应该是个可行的方法。就是略微繁琐。
回复 使用道具 举报
大虾挂了 发表于 2013-10-17 17:35
这个应该不行吧。1 2 3 5 6 7,cont也会加4次,也会是5,但是这明显不存在5个连续的数字啊。 ...

中间断开就重置为1了。
回复 使用道具 举报

这个应该不行吧。1 2 3 5 6 7,cont也会加4次,也会是5,但是这明显不存在5个连续的数字啊。
回复 使用道具 举报
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace puke
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             int[] nums = {2,3,4,5,6,3};
  12.             int temp, last, count;
  13.             bool win=false;
  14.             //List<int> row = new List<int>();
  15.             //冒泡排序
  16.             for (int i = 0; i < nums.Length; i++)
  17.             {
  18.                 for (int j = i + 1; j < nums.Length; j++)
  19.                 {
  20.                     if (nums[i] > nums[j])
  21.                     {
  22.                         temp = nums[i];
  23.                         nums[i] = nums[j];
  24.                         nums[j] = temp;
  25.                     }
  26.                 }
  27.             }
  28.             //查找连续牌
  29.             count = 1;
  30.             for (int i = 1; i < nums.Length; i++)
  31.             {
  32.                 if (nums[i] - nums[i - 1] == 1)
  33.                 {
  34.                     count++;
  35.                     if (count == 5) win = true;
  36.                 }
  37.                 else if (nums[i] - nums[i - 1] == 0) ;
  38.                 else count = 1;
  39.             }
  40.             if (win) Console.WriteLine("Win!");
  41.             else Console.WriteLine("Lost!");
  42.             Console.ReadKey();
  43.         }
  44.     }
  45. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 面朝大海,春暖 于 2013-10-17 16:07 编辑

不对哟。。。。
回复 使用道具 举报
本帖最后由 面朝大海,春暖 于 2013-10-17 15:34 编辑

太深奥了。。
回复 使用道具 举报
面朝大海,春暖 发表于 2013-10-3 20:39
我倒是有个想法,可以把六个数存入一个数组,然后用第 i+1 个数减去第 i 个数,如果等于一,直接返回true或 ...

这里问题补充下,要的是6个数字中存在5个连续的即可,比如 1  3  2  5  4  7就是存在5个连续的(1 2 3 4 5)

想要一个比较简单的算法,即使没有代码,像我1L那样写出来想法也好
回复 使用道具 举报
面朝大海,春暖 发表于 2013-10-3 20:39
我倒是有个想法,可以把六个数存入一个数组,然后用第 i+1 个数减去第 i 个数,如果等于一,直接返回true或 ...

你这样是检查6个数字是不是都连续的。。。。如果那样的话其实只要先冒泡排序,排序的同时添加检查是否有相等数字,有相等直接跳出排序,判断6个数字不连续,无相等数字,只要检查最后一个数字-第一个数字是不是为5即可。前面我发过5个数字是否连续的贴子的。
回复 使用道具 举报
追溯客 发表于 2013-10-14 17:03
楼主你好,如果你的问题已解决请解释,请及时把分类设为已解决,黑马有你更精彩! ...

其实没有解决啊
回复 使用道具 举报

楼主你好,如果你的问题已解决请解释,请及时把分类设为已解决,黑马有你更精彩!
回复 使用道具 举报
本帖最后由 面朝大海,春暖 于 2013-10-3 21:51 编辑

我倒是有个想法,可以把六个数存入一个数组,然后用第 i+1 个数减去第 i 个数,如果等于一,直接返回true或输出,举个例子吧!(当然要排序,再做减法)
int[] A=new int[6];
for(int i=0;i<6;i++)
{
if((A[i+1]-A)==1)
{
//如果循环完毕差值全部等于一表示是连续的,直接输出就OK
}
}

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
夢醒了⊙﹏⊙b心 发表于 2013-10-2 10:14
你是不是想输出结果是{有五个还是没有五个}这种结果吗  如果是 那么这道题就简单了   首先输入一个值保存至 ...

每太理解你的意思。确实是只要确认是否有5个连续的就行。最好最终能得到这5个连续的数字。我菜鸟,你能稍微写点代码么
回复 使用道具 举报
你是不是想输出结果是{有五个还是没有五个}这种结果吗  如果是 那么这道题就简单了   首先输入一个值保存至一个临时变量 然后设计一个5次的循环 每次循环和这个临时变量进行比较 如果相等则申明一个迭代变量进行累加 不相等则将这个值赋值给先前声明的临时变量 最后退出循环判断次数是否为5并输出结果
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马