杭电2045不容易系列之(3)—— LELE的RPG难题
人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过多方打探,某资深Cole终于知道了原因,原来,LELE最近研究起了著名的RPG难题:
有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.
以上就是著名的RPG难题.
如果你是Cole,我想你一定会想尽办法帮助LELE解决这个问题的;如果不是,看在众多漂亮的痛不欲生的Cole女的面子上,你也不会袖手旁观吧?
Input
输入数据包含多个测试实例,每个测试实例占一行,由一个整数N组成,(0<n<=50)。
Output
对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。
Sample Input
1
3
Sample Output
3
6
有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.
题目就是这样的,首尾不能同色,相邻不能同色。
大神思路:
跟以前的分析一样,同样是找f(n)与前面的关系。
要算f(n);
第一就要研究第n-1个格子的状况;
先要解释一下f(n-1)是什么情况的种类数,当n-1个格子满足题目条件时的种类。
当n-1与第一个不同色的时候(那么此时f(n-1)就是此时n-1个格子的种类了),那么此时f(n)的种类就应该是加上f(n-1);为什么呢?来分析一下。n-1与n相邻,则他们两个不能同色,但n-1又与第一个不同色,而n又不能他同色,只有三种颜色,那么n就没有选择,则它的种类数就要加上f(n-1)了。
当n-1与第一个格子相同时(此时就不能吧f(n-1)放进去了)。要研究f(n)这要怎么研究呢?先看看联系得到f(n-2)波?n-2与n-1相邻则他们两个不会同色,并且可以得出n-2与第一个也不会同色,是不是有f(n-2)的条件满足了。在就看怎么联系到f(n)了。n与n-1相邻则他们不会同色,并且n-1也与第一个同色,那么可以推出n有两种情况可以选择了。那么是不是将2乘以f(n-2)呢?答案是的。的确是这样子的。知道为什么吗?这个应该不难想到吧。N-1与第一个相同。那么f(n)就是与f(n-2)有联系了,而n有两种状态,当然是乘以2啊。
可以写递归方程了。
F(n) =f(n-1)+2*f(n-2);
#include<stdio.h>
int main()
{
int n,i;
double a[55]={3,6,6};
for(i=3;i<52;i++)
{
a[i]=2*a[i-2]+a[i-1];
}
while(scanf("%d",&n)!=EOF)
{
printf("%.0lf\n",a[n-1]);
}
return 0;
}
注意用double。