面壁中叶文洁 发表于 2020-5-1 13:13:23

关于三色球问题呢

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

for i1 in x:
    for i2 in x:
      for i3 in x:
            for i4 in x:
                for i5 in x:
                  for i6 in x:
                        for i7 in x:
                            for i8 in x:
                              ball =
                              red = 0
                              yellow = 0
                              green = 0
                              for tamp in ball:
                                    
                                    if tamp == "红":
                                        red += 1
                                    if tamp == "黄":
                                        yellow += 1
                                    if tamp == "绿" :
                                        green += 1
                              if red <= 3 and yellow <=3 and green<=6 :
                                    print(i1,i2,i3,i4,i5,i6,i7,i8)

jkluoling1992 发表于 2020-5-1 13:33:53

本帖最后由 jkluoling1992 于 2020-5-1 13:48 编辑

print('red\t yellow\t blue')
red = 0
yellow = 0
while red in range(0,4):
    while yellow in range(0,4):
      blue = 8 - red - yellow
      if blue < 4:
            print(red, '\t', yellow, '\t', blue)
      yellow += 1
    red += 1
    yellow = 0

星河主炮 发表于 2020-5-1 13:58:33

本帖最后由 星河主炮 于 2020-5-1 14:09 编辑

有问题,不好意思

沐羽尘 发表于 2020-5-1 14:36:26

那个,能不能把问题说清楚一点,红色三个,黄色三个,绿色三个,抽取八个,感觉有点问题的样子,
而且你的代码 emmm 那个 for循环是按顺序迭代的,不是随机抽取的哦,感觉实现不了你想要的功能

沐羽尘 发表于 2020-5-1 15:19:07

如果你是需要可以输出一个一段有顺序的三色球的字符,那下面这段代码应该阔以
def ball():
    import random as r
    cho = []
    chos = ['红','黄','绿']
    count1 = 0
    while len(cho) < 8:
      cho.append(r.choice(chos))
      a = cho.count('红')
      b = cho.count('黄')
      c = cho.count('绿')
      count1 += 1
      if a > 3 or b > 3 or c > 3:
            cho.pop()
            count1 -= 1
      else :
            continue
    return cho
a = ball()
for i in a:
    print(i,end = ' ')


不知道你有没有学到函数,这个加了注释import random as r
cho = []#这是球的列表
chos = ['红','黄','绿'] #随机选项
count1 = 0 #计数器
while len(cho) < 8:
    cho.append(r.choice(chos)) #把随机选择添加到列表
    a = cho.count('红') #记录各三色球总数
    b = cho.count('黄')
    c = cho.count('绿')
    count1 += 1 #计数加一
    if a > 3 or b > 3 or c > 3:
      cho.pop() #球超过需要总数时撤销上一步操作
      count1 -= 1
    else :
      continue
   
for i in cho:
    print(i,end = ' ')

赚小钱 发表于 2020-5-8 21:41:35

本帖最后由 赚小钱 于 2020-5-8 21:51 编辑

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

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

对于第一步, 伪代码如下

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

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

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

    // 忽略第一个元素,将可跳过数量 减去 1
    dfs(remain_list, result, remain_skip_count - 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 中
那么,就可以调用上面的函数

dfs(input_list, [], a + b + c - n );
页: [1]
查看完整版本: 关于三色球问题呢