用递归的思想去解题。
首先将最后一个凹槽各为1,2,3,4,5,6时,各设为一种情况
可以很快得出结论
钥匙总数=最后一个凹槽为1时的情况+2+3+4+5+6
容易看出1=6,2=3=4=5
那么简化为
钥匙总数=2*最后一个凹槽为1时的情况+4*最后一个凹槽为2时的情况。
要追加一个凹槽,需要分析两个情况
1、加上第n个凹槽之前,前面n-1个凹槽符合钥匙规则,那么
A情况,第n个凹槽中成员为2||3||4||5时,无论如何都符合构成钥匙的条件,那么情况A总数为:前面
n-1个凹槽时钥匙的总数
B情况,第n个凹槽成员为1||6时,要考虑到第n-1个凹槽是否为1||6。这里假设第n个凹槽成员为1,那么
第n-1个凹槽的成员就不能为6,容易得出B情况总数=(n-1)个凹槽时钥匙的总数-第n-1个凹槽数不为6的情况
2、加上第n个凹槽之前,前面n-1个凹槽并不符合钥匙规则,只有加上第n个凹槽后才符合钥匙规则。
A情况,第n个凹槽中成员为2||3||4||5时,前面必须只有两种类型,加上第n个凹槽才会符合规则,这样的类型组合
总共有C(5,2)种情况,这样的类型排列有2^(n-1)-2种情况。
B情况,第n个凹槽成员为1||6时,要考虑到第n-1个凹槽是否为1||6。假设第n个凹槽成员为1,那么当类型组合
中有一个是6时,这样的类型组合有C(4,1)(2,3,4,5)种,类型的排列总数有:2^(n-2)-1种情况(去掉一种全等情况)
首先将最后一个凹槽各为1,2,3,4,5,6时,各设为一种情况
可以很快得出结论
钥匙总数=最后一个凹槽为1时的情况+2+3+4+5+6
容易看出1=6,2=3=4=5
那么简化为
钥匙总数=2*最后一个凹槽为1时的情况+4*最后一个凹槽为2时的情况。
要追加一个凹槽,需要分析两个情况
1、加上第n个凹槽之前,前面n-1个凹槽符合钥匙规则,那么
A情况,第n个凹槽中成员为2||3||4||5时,无论如何都符合构成钥匙的条件,那么情况A总数为:前面
n-1个凹槽时钥匙的总数
B情况,第n个凹槽成员为1||6时,要考虑到第n-1个凹槽是否为1||6。这里假设第n个凹槽成员为1,那么
第n-1个凹槽的成员就不能为6,容易得出B情况总数=(n-1)个凹槽时钥匙的总数-第n-1个凹槽数不为6的情况
2、加上第n个凹槽之前,前面n-1个凹槽并不符合钥匙规则,只有加上第n个凹槽后才符合钥匙规则。
A情况,第n个凹槽中成员为2||3||4||5时,前面必须只有两种类型,加上第n个凹槽才会符合规则,这样的类型组合
总共有C(5,2)种情况,这样的类型排列有2^(n-1)-2种情况。
B情况,第n个凹槽成员为1||6时,要考虑到第n-1个凹槽是否为1||6。假设第n个凹槽成员为1,那么当类型组合
中有一个是6时,这样的类型组合有C(4,1)(2,3,4,5)种,类型的排列总数有:2^(n-2)-1种情况(去掉一种全等情况)
将以上的值总和起来,易得出如下代码。
#include<stdio.h>
#include<math.h>
int main()
{
__int64 lock[26]={0};
__int64 one[26]={0};
__int64 two[26]={0};
lock[3]=104;
one[3]=16,two[3]=18;
printf("N=3: %I64d\n",lock[3]);
for(int n=4;n<26;n++)
{
one[n]+=lock[n-1]-one[n-1]+6*((__int64)pow((float)2,n-1)-2)+4*((__int64)pow((float)2,n-2)-1);
two[n]+=lock[n-1]+9*((__int64)pow((float)2,n-1)-2);
lock[n]+=2*one[n]+4*two[n];
printf("N=%d: %I64d\n",n,lock[n]);
}
}