|
|
发表于 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 );
复制代码
|
|