关于三色球问题呢
怎么才能实现三色球的排列组合,红色三个,黄色三个,绿色三个,抽取八个,搞了半天只会把可能性算出来,不会筛选掉重复的功能,而且我的代码不断嵌套,感觉很乱很乱的样子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: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 14:09 编辑
有问题,不好意思 那个,能不能把问题说清楚一点,红色三个,黄色三个,绿色三个,抽取八个,感觉有点问题的样子,
而且你的代码 emmm 那个 for循环是按顺序迭代的,不是随机抽取的哦,感觉实现不了你想要的功能
如果你是需要可以输出一个一段有顺序的三色球的字符,那下面这段代码应该阔以
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: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]