题目描述
有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法。
题解
这是一道递推题。一般来说,递推要从最一般的情况中推出递推公式。再结合边界情况便能解决。
考虑该题的最一般情况:已经涂好了n个格子,现在要涂第n+1个格子。那么现在就有两种涂法。
1.因为前n个格子已经涂好,那么第一个格子和第n个格子的颜色一定不同。现在要涂第n+1个格子的要求是不能个第n个相同,也不能和第一个相同。那第n+1个格子只能有一种涂法。这样n+1个格子的方案数就与n个格子的方案数相同。
2.在涂第n+1个格子前,将第n个格子的颜色涂为与第一个格子颜色相同。那么现在第n+1个格子的涂法就有两种。实际上,此时n+1个格子的方案就位n-1个格子的方案数乘二。
结合上面两种情况就能写出递推公式:,a[i]表示有i个格子的方案数。
AC代码
#include<stdio.h>
int main()
{
int n;
long long a[50];
a[0]=3;a[1]=6;a[2]=6;
for(int i=3;i<50;i++)
a[i]=a[i-1]+2*a[i-2];
while(scanf("%d",&n)!=EOF){
printf("%lld\n",a[n-1]);
}
}