鱼C论坛

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

关于三色球问题呢

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

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

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

x
怎么才能实现三色球的排列组合,红色三个,黄色三个,绿色三个,抽取八个,搞了半天只会把可能性算出来,不会筛选掉重复的功能,而且我的代码不断嵌套,感觉很乱很乱的样子
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 = [i1,i2,i3,i4,i5,i6,i7,i8]
                                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) 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

有问题,不好意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 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 = ' ')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[1..], result.push(remain_list[0]), remain_skip_count);

    // 忽略第一个元素,将可跳过数量 减去 1
    dfs(remain_list[1..], 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 );
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 05:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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