【阿里】一个圆分成N个扇形,有M中颜色,求领域不同色的所有涂色方案数

设F(N,M)为满足的所有方案

N=1时,有M种

N=2时,有M*(M-1)种

N=3时,有M*(M-1)*(M-2)种

当N>=4时:

    先考虑所有可以重色的方案:即M*(M-1)*(M-1)*(M-1)

    其中包括第一块和最后一块重色的方案,只要减去即可。把第一块和最后一块作为同一个颜色块考虑的话,问题变为3区域不同色,即F(4,M) = M*(M-1)*(M-1)*(M-1) - F(3,M)。所以方案的递推公式是:

#include "stdio.h"
#include "math.h"
 
double recurve(int n,int m){
	double kinds;
	if(n==1){
		kinds = m;
	}
	if (n==2){
		kinds = m*(m-1);
	}
	if (n==3){
		kinds = m*(m-1)*(m-2);
	}
	if (n>3){
		kinds = m*pow(m-1,n-1) - recurve(n-1,m);
	}
	return kinds;
}
 
void main()
{
    int n,m;
    double kind;
    scanf("%d %d",&n,&m); 
	kind = recurve(n,m);
	printf("%f",kind);    
}

猜你喜欢

转载自blog.csdn.net/xiaocong1990/article/details/83117535