鱼C论坛

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

关于三色球问题呢

[复制链接]
发表于 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-10-28 04:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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