栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

蓝桥杯 深度优先搜索 排列小球

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

蓝桥杯 深度优先搜索 排列小球

排列小球 问题描述:

小蓝有黄绿蓝三种颜色的小球,分别为 R, G, B 个。同样颜色的小球没有区别。
小蓝将这些小球从左到右排成一排,排完后,将最左边的连续同色小球个数记为 t_1,
将接下来的连续小球个数记为 t_2,以此类推直到最右边的小球。
请问,总共有多少种摆放小球的方案,使得 t_1, t_2, … 为严格单调递增序列,即 t_1 < t_2 < t_3 < …

输入格式

输入一行包含三个整数 R, G, B。

输出格式

输出一个整数,表示答案。

样例输入

3 6 0

样例输出

3

样例说明

用 r 表示红球,g 表示绿球,可能的方案包括:
rrrgggggg 036
grrrggggg 135
ggrrrgggg 234

样例输入

2 4 6

样例输出

3

样例说明

用 r 表示红球,g 表示绿球,b 表示蓝球,可能的方案包括:
rrggggbbbbbb
grrgggbbbbbb
brrggggbbbbb

思路:

因为全排列时间复杂度巨大,所以用深搜选择性的查找符合条件的序列
本题可以想象成: 手上拿着这些球,然后往地上放,每次拿与上次不同颜色的小球放,且放的数量必须比上次多,如果最后手上没球了,就记下这个序列;如果最后手上的球在符合规则的情况下放不进去了,就不继续进行了,并且把刚刚放的再拿回来,重新放,如果还不行,就一直往回拿直到可以放另一种情况为止。直到所有情况全部模拟完。

C/C++代码:
#include 
using namespace std;
int a[3],count=0; //a[3]放三种颜色的球 
void dfs(int sum,int num,int lastColor) {
	if (sum==0) {//手上没有球了就结束 
		count++;
		return;
	}
	for (int i=0;i<3;i++) {
		if (i==lastColor) continue;//不能挨着放同种颜色 
		for (int j=num+1;j<=a[i];j++) {//从最少放的球数开始循环到手上还有该种颜色的球数 
			a[i]=a[i]-j;//减少手上对应的球的数量 
			dfs(sum-j,j,i);//j为放入序列的球数 i为这次放的球的颜色 
			a[i]=a[i]+j;//深搜完一种情况后,恢复手上该颜色球的数量 
		}
	}
}
int main() {
	int sum=0;
	for (int i=0;i<3;i++) {
		cin>>a[i];
		sum=sum+a[i];
	}
	dfs(sum,0,-1);//(没放入序列的小球 , 上一次放的球数 , 上一次放的球的颜色) 
	cout<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/955188.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号