Problem Description
从三个元素的集合[A,B,C]中选取元素生成一个N个字符组成的序列,使得没有两个相邻字的子序列(子序列长度=2)相同。例:N=5时ABCBA是合格的,而序列ABCBC与ABABC是不合格的,因为其中子序列BC,AB是相同的。
对于由键盘输入的N(1<=N<=12),求出满足条件的N个字符的所有序列总数。
对于由键盘输入的N(1<=N<=12),求出满足条件的N个字符的所有序列总数。
Input
输入有多组数据,每组数据只有一行为一个整数N。
Output
对于每组数据满足条件的N个字符的所有序列总数
Sample Input
4
Sample Output
72
#include<iostream> #include<cstring> #include<cstdio> using namespace std; #define MAX(a,b) ((a)>(b) ? (a):(b)) #define MIN(a,b) ((a)<(b) ? (a):(b)) int ans,n,a[15]; void search(int x) { for(int i=1;i<4;i++) { a[x]=i; if(x>3) { if(a[x-1]*10+a[x]==a[x-3]*10+a[x-2]) continue; } if(x==n) ans++; else search(x+1); } } int main() { while(scanf("%d",&n)!=EOF) { memset(a,0,sizeof(a)); ans=0; if(n<4) { if(n==1) printf("3\n"); if(n==2) printf("9\n"); if(n==3) printf("27\n"); } else { search(1); printf("%d\n",ans); } } return 0; }