HDU-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
2
Sample Output
3
6
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define N 55
long long a[N];
void fill_colour()
{
a[1] = 3;
a[2] = 6;
a[3] = 6;
for(int i = 4;i < N;i++)
{
a[i] = a[i - 1] + 2 * a[i - 2];
}
}
int main()
{
fill_colour();
int n;
while(scanf("%d",&n) != EOF)
{
cout << a[n] << endl;
}
return 0;
}
刚看到这道题的时候,就想起了高中时学过的排列组合题。其实这道题的做法和高中里排列组合题类似。我们这里将a[n] 表示为n个格子时的填涂颜色的总共方式。
a[1] = 3(如果只有1个格子那总共有3种填涂方式)
a[2] = 6(如果有2个格子,那么第一个格子有3种填图方式,第二个格子有2种,因为第二个格子颜色应该与第一个格子不同,所以总共为3 * 2 = 6)
a[3] = 6(三个格子的时候,第一个格子有三种可能,对于第二个格子而言除了第一个格子的颜色其他两种颜色都可以选择,也就是两种可能,第三个格子由于不能和第一块格子的颜色相同,并且也不能和第二块格子的颜色相同,所以第三个格子是没有选择的,也就是唯一确定的,总共加起来也就是 3* 2 = 6)
现在来讨论当n>= 4的时候的普遍情况,对于a[n]而言,可以分为两种情况,第一种就是当n - 1个格子的颜色与第一个格子的颜色是相同的时候,那么对于第n - 2个格子来说它的颜色必定和第一个格子的颜色是不同的,那么此时第n种格子还剩下2种填涂选择,所以a[n] = 2 * a[n - 2]。第二种情况就是当n - 1个格子的颜色与第一个格子的颜色是不同,这时候最后一个格子也就唯一确定了(因为最后一个格子既不能和第一个格子颜色相同,也不能和n - 1个格子颜色相同,并且第一个格子和n - 1个格子的颜色也不一样),所以a[n] = a[n - 1].综合这两种情况a[n] = a[n - 1] + 2 * a[n - 2].
得出了这个关系,这道题也就变得容易了许多,这里本人采取的是打表的方式去处理这个问题(注意:这里的数组一定要开long long型的因为当n变大的时候,a[n]的大小会超出int的范围).