字符序列(characts)

字符序列(characts)

问题描述:

从三个元素的集合[A,B,C]中选取元素生成一个N 个字符组成的序列,使得没有两个相邻的

子序列(子序列长度=2)相同,例:N=5 时ABCBA 是合格的,而序列ABCBC 与ABABC 是不

合格的,因为其中子序列BC,AB 是相同的。

输入N(1<=N<=12),求出满足条件的N 个字符的所有序列和其总数。

输入样例:

4

输出样例:

72

**

 1 #include<iostream>
 2 
 3 #include<cstdlib>
 4 
 5 using namespace std;
 6 
 7 int n,a[100],s;
 8 
 9 void go(int x)
10 
11 {
12 
13          if (x>n)
14 
15          {
16 
17                    s++;
18 
19                    return;
20 
21                    }  //如果这个长度等于要求的长度,就把可能性加一重新进行下一次搜索
22 
23          int i;
24 
25          for (i=1;i<=3;i++)
26 
27          if (a[x-3]*10+a[x-2]!=a[x-1]*10+i)  //判断子序列,如果满足要求则把这个位置放这个值
28 
29          {
30 
31                    a[x]=i;
32 
33                    go(x+1);  //进行下一次搜索
34 
35                    }
36 
37 }
38 
39 int main()
40 
41 {
42 
43          cin>>n;
44 
45          if (n<=2)
46 
47          {
48 
49                    if (n==1) cout<<3;
50 
51                    else cout<<9;
52 
53                    cout<<endl;   
54 
55                    exit(0);
56 
57                    }
58 
59          s=0;
60 
61          int i,j,k;
62 
63          for (i=1;i<=3;i++)
64 
65            for (j=1;j<=3;j++)
66 
67              for (k=1;k<=3;k++)
68 
69            {
70 
71                             a[1]=i; a[2]=j; a[3]=k; //枚举出前三个位置所有的可能性在这个情况下进行下一步搜索
72 
73                             go(4);
74 
75                             }
76 
77          cout<<s<<endl;
78 
79          return 0;
80 
81 }

前三位位置枚举,后面的值判断满足要求就留在那个位置,满足数量就加一。

一开始的时候我就直接,枚举前四个数的可能性

原文地址:https://www.cnblogs.com/rax-/p/8680768.html