Color 递归

本文深入探讨了颜色在设计和编程中的递归应用,通过实例解析如何实现颜色的递归算法,帮助读者理解递归思想在视觉艺术中的独特魅力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考优快云博主码代码的猿猿 http://blog.youkuaiyun.com/ck_boss/article/details/17042451

Description

题目描述

给你n个方格,m种颜色,要求相邻格和首尾格的颜色不同,请问有多少种不同的填涂方法。

输入

每行输出两个整数n和m,1≤n,m≤1,000。

输出

每行输出一个样例的结果,由于可能会很大,最后结果对1000003取模。

样例输入
1 1 
1 2 
3 2 
1000 10

样例输出
1
2
0
566585


主要思路:
n=1时:m
n=2时:m*(m-1)
n=3时:m*(m-1)*(m-2)
n>3时:
两种情况考虑:
若n-1与1颜色不同,则f[n-1]是排列好的,n号方块有m-2种颜色可涂  f[n]+=f[n-1]*(m-2)   若n-1与1颜色相同,则f[n-2]是排列好的,n号方块有m-1种颜色可涂  f[n]+=f[n-2]*(m-1)
#include <stdio.h>
#include <string.h> 
#define MOD 1000003

long long int F[3000];  //分号记得加 
int main()
{
    int n,m,i;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
    	memset(F,0,sizeof(F)); 
		F[1] = m%MOD;       //递归 
		F[2] = m*(m-1)%MOD;
		F[3] = m*(m-1)*(m-2)%MOD;
		if(n>=4)
		for(i=4; i<=n; i++)
		{
			F[i] = F[i-2]*(m-1)%MOD + F[i-1]*(m-2)%MOD;
		}
		printf("%d\n",F[n]%MOD);	
    } 
    return 0;
}

#include <stdio.h>
#define MOD 1000003

long long int F[3000];  //分号记得加 
int main()
{
    int n,m,i;
    {
    	memset(F,0,sizeof(F)); 
		F[1] = m%MOD;       //递归 
		F[2] = m*(m-1)%MOD;
		F[3] = m*(m-1)*(m-2)%MOD;
		if(n>=4)
		for(i=4; i<=n; i++)
		{
			F[i] = F[i-2]*(m-1)%MOD + F[i-1]*(m-2)%MOD;
		}
		printf("%d\n",F[n]%MOD);	
    } 
    return 0;
}




这题学到的东西很多:
1、memset 可用来 初始化数组,但在C primer plus 上没有找到,改天找到了再补充。2行和11行有或没有都能运行,我用11行是是用来初始化数组的,但是c语言群里的人说memset本来就是快速格式化 , 定义的全局数组本来就是0,快速格式化也是为了保险起见 。其实我并没有懂,快速格式化的memset用法和初始化是否相同?百度上memset用法写得太杂了。
请教大鹏得知,memset在这题中就是初始化数组的,如果不写也可以,因为数组本来就可以不初始化。这个语句把数组全部设置为0,如果不写,那么调用的时候给多少赋值就返回多少。
2、#define MOD 3000 宏定义常量。
3、 long long int F[3000]; 刚开始和头文件写在一起没有空行,忘记加分号。
4、EOF代表的值表示检测到文件结尾,例如,将getchar()的返回值于EOF比较。如果不相同,则还没有到达文件结尾,表达式为while((ch=getchar())!= EOF)(C primer plus p190)
5、此题运用的递归相较最大公约数,更清晰地体现了递归的思想,先算出F[1],F[2],F[3],然后才开始算后面的。

6、调用memset函数就需要在头文件中加上string.h。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值