1.问题描述:
给出红、黄、蓝三种颜色的盒子各有若干个(a、b、c),将其排成一排,要求相同颜色的盒子不能相邻,直到盒子用完或者没有合适颜色的盒子为止,输出总共有多少种排列方式?
例如:输入 红:a=1, 黄:b=1,蓝:c=1
输出为:6
例如:输入 红:a=1, 黄:b=2,蓝:c=1
输出为:8
2.c++代码如下:
#include<iostream>
#include<Windows.h>
using namespace std;
//判断是否有匹配颜色的盒子
bool isNomatch(int a, int b, int c, char r)
{
switch (r)
{
case 'a':
if (b > 0 || c > 0) return false;
break;
case 'b':
if (a > 0 || c > 0) return false;
break;
case 'c':
if (a > 0 || b > 0) return false;
break;
}
return true;
}
//在第一个确定为红、黄、蓝盒子的情况下统计排列种类
void arrage(int a, int b, int c, char r, int &sortCount)
{
if (a + b + c == 0 || isNomatch(a, b, c, r))
{
sortCount++;
return;
}
if (a > 0 && r != 'a')
{
a--;
arrage(a, b, c, 'a', sortCount);
a++;
}
if (b > 0 && r != 'b')
{
b--;
arrage(a, b, c, 'b', sortCount);
b++;
}
if (c > 0 && r != 'c')
{
c--;
arrage(a, b, c, 'c', sortCount);
c++;
}
}
//分别对第一个盒子为红、黄、蓝盒子的情况进程遍历累加其总共的排列数
int calculateCount(int a, int b, int c)
{
int count = 0;
char r;
int t[3] = { a,b,c };
for (int i = 0, r = 'a'; i < 3; i++, r++)
{
t[i]--;
arrage(t[0], t[1], t[2], r, count);
t[i]++;
}
return count;
}
//运行代码
int main()
{
cout << calculateCount(1,2,1) << endl;
system("pause");
return 0;
}