鱼C论坛

 找回密码
 立即注册
查看: 1469|回复: 5

关于三色球问题呢

[复制链接]
发表于 2020-5-1 13:13:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
怎么才能实现三色球的排列组合,红色三个,黄色三个,绿色三个,抽取八个,搞了半天只会把可能性算出来,不会筛选掉重复的功能,而且我的代码不断嵌套,感觉很乱很乱的样子
  1. x = ["红","红","红","黄","黄","黄","绿","绿","绿","绿","绿","绿"]
  2. i1=0
  3. i2=0
  4. i3=0
  5. i4=0
  6. i5=0
  7. i6=0
  8. i7=0
  9. i8=0

  10. for i1 in x:
  11.     for i2 in x:
  12.         for i3 in x:
  13.             for i4 in x:
  14.                 for i5 in x:
  15.                     for i6 in x:
  16.                         for i7 in x:
  17.                             for i8 in x:
  18.                                 ball = [i1,i2,i3,i4,i5,i6,i7,i8]
  19.                                 red = 0
  20.                                 yellow = 0
  21.                                 green = 0
  22.                                 for tamp in ball:
  23.                                     
  24.                                     if tamp == "红":
  25.                                         red += 1
  26.                                     if tamp == "黄":
  27.                                         yellow += 1
  28.                                     if tamp == "绿" :
  29.                                         green += 1
  30.                                 if red <= 3 and yellow <=3 and green<=6 :
  31.                                     print(i1,i2,i3,i4,i5,i6,i7,i8)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-1 13:33:53 | 显示全部楼层
本帖最后由 jkluoling1992 于 2020-5-1 13:48 编辑
  1. print('red\t yellow\t blue')
  2. red = 0
  3. yellow = 0
  4. while red in range(0,4):
  5.     while yellow in range(0,4):
  6.         blue = 8 - red - yellow
  7.         if blue < 4:
  8.             print(red, '\t', yellow, '\t', blue)
  9.         yellow += 1
  10.     red += 1
  11.     yellow = 0
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-5-1 13:58:33 | 显示全部楼层
本帖最后由 星河主炮 于 2020-5-1 14:09 编辑

有问题,不好意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-1 14:36:26 | 显示全部楼层
那个,能不能把问题说清楚一点,红色三个,黄色三个,绿色三个,抽取八个,感觉有点问题的样子,
而且你的代码 emmm 那个 for循环是按顺序迭代的,不是随机抽取的哦,感觉实现不了你想要的功能
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-1 15:19:07 | 显示全部楼层
如果你是需要可以输出一个一段有顺序的三色球的字符,那下面这段代码应该阔以

  1. def ball():
  2.     import random as r
  3.     cho = []
  4.     chos = ['红','黄','绿']
  5.     count1 = 0
  6.     while len(cho) < 8:
  7.         cho.append(r.choice(chos))
  8.         a = cho.count('红')
  9.         b = cho.count('黄')
  10.         c = cho.count('绿')
  11.         count1 += 1
  12.         if a > 3 or b > 3 or c > 3:
  13.             cho.pop()
  14.             count1 -= 1
  15.         else :
  16.             continue
  17.     return cho
  18. a = ball()
  19. for i in a:
  20.     print(i,end = ' ')
复制代码


不知道你有没有学到函数,这个加了注释
  1. import random as r
  2. cho = []  #这是球的列表
  3. chos = ['红','黄','绿'] #随机选项
  4. count1 = 0 #计数器
  5. while len(cho) < 8:
  6.     cho.append(r.choice(chos)) #把随机选择添加到列表
  7.     a = cho.count('红') #记录各三色球总数
  8.     b = cho.count('黄')
  9.     c = cho.count('绿')
  10.     count1 += 1 #计数加一
  11.     if a > 3 or b > 3 or c > 3:
  12.         cho.pop() #球超过需要总数时撤销上一步操作
  13.         count1 -= 1
  14.     else :
  15.         continue
  16.    
  17. for i in cho:
  18.     print(i,end = ' ')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-8 21:41:35 | 显示全部楼层
本帖最后由 赚小钱 于 2020-5-8 21:51 编辑

这是一个搜索问题,分成两步

第一步,从 9 个球中选择 8 个出来
第二部,8个球的全排列

对于第一步, 伪代码如下

  1. void dfs(remain_list,result,remain_skip_count) {
  2.     // 两种退出情况

  3.     // 当前无可跳过的元素,即表示,剩下的元素全都要
  4.     if remain_skip_count <= 0 {
  5.         result.push(remain_list)
  6.         print(result);
  7.         return;
  8.     }

  9.     // 当前剩余的元素不超过可跳过的数量,表示剩下的元素可以全都不要
  10.     if remain_list.length() <= remain_skip_count {
  11.         print(result);
  12.         return;
  13.     }
  14.     // 将第一个元素添加到结果中, 此时没有跳过元素,所以 remain_skip_count 不变
  15.     dfs(remain_list[1..], result.push(remain_list[0]), remain_skip_count);

  16.     // 忽略第一个元素,将可跳过数量 减去 1
  17.     dfs(remain_list[1..], result, remain_skip_count - 1);
  18. }
复制代码

如下方式调用函数

  1. dfs(['r','r','r','y','y','y','g','g','g'],[], 1);
复制代码


对于第二步,就是一个全排列搜索了,代码与第一步类似,自己思考吧。

而且,这道题可以进一步的改进,有 a 个 R(ed) 球,b 个 G(reen) 球,c 个 B(lue) 球,取出 n 个球,打印出所有的取出方式。

那么思路不变,首先写个方法把 a 个 R(ed) 球,b 个 G(reen) 球,c 个 B(lue) 球 写入一个列表中 (三个 for 循环搞定), 假设存储在 变量 input_list 中
那么,就可以调用上面的函数

  1. dfs(input_list, [], a + b + c - n );
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-19 01:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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