【阿里】一个圆分成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);    
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用OpenGL和C++绘制实心的示例代码: ```c++ #include <GL/glut.h> #include <cmath> const float PI = 3.1415926f; // 定义周率 void drawSolidCircle(float x, float y, float radius, int numSlices) { const float angleStep = 2.0f * PI / numSlices; // 计算每个扇形的角度 glBegin(GL_TRIANGLE_FAN); glColor3f(1.0f, 0.0f, 0.0f); // 设置第一个扇形颜色 glVertex2f(x, y); // 心点 for (int i = 0; i <= numSlices; ++i) { float angle = i * angleStep; float dx = radius * std::cos(angle); float dy = radius * std::sin(angle); if (i % 2 == 0) { glColor3f(1.0f, 0.0f, 0.0f); // 设置偶数扇形颜色 } else { glColor3f(0.0f, 1.0f, 0.0f); // 设置奇数扇形颜色 } glVertex2f(x + dx, y + dy); } glEnd(); } void display() { glClear(GL_COLOR_BUFFER_BIT); drawSolidCircle(0.0f, 0.0f, 0.5f, 36); // 绘制分成36个扇形 glutSwapBuffers(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); glutInitWindowSize(800, 600); glutCreateWindow("Solid Circle"); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 在这个示例代码,我们使用了OpenGL的核心图形函数`glBegin`和`glVertex`来绘制实心。`glBegin`函数告诉OpenGL开始绘制一个几何图形,`glVertex`函数则用于指定每个顶点的位置。我们使用`GL_TRIANGLE_FAN`模式绘制,这个模式会从心开始绘制,然后依次连接每个顶点,形成若干个扇形。我们通过循环计算出每个顶点的坐标,并通过`glColor`函数设置每个扇形颜色。在这个示例,我们将分成了36个扇形,并将偶数扇形设置为红,奇数扇形设置为绿。 运行上述代码,可以看到绘制出来的实心分成了36个扇形,每个扇形颜色不同

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值