Description
从三个元素的集合[A,B,C]中选取元素生成一个N个字符组成的序列,使得没有两个相邻字的子序列相同。例:N = 5时ABCBA是合格的,而序列ABCBC与ABABC是不合格的,因为其中子序列BC,AB是相同的。
Input
对于由键盘输入的N(1<=n<=10)
Output
求出满足条件的N个字符的所有序列和其总数?
Sample Input
3
Sample Output
ABA
ABC
ACA
ACB
BAB
BAC
BCA
BCB
CAB
CAC
CBA
CBC
12
这题我是用搜索的方法来做的
在搜的时候,如果这个字母填下去不会有两个相邻的子序列的话,就记录下来,填完了就输出并统计。
var a:array[0..100]of longint; n,tj,i,j,k,s,bz:longint; function check(x,l:longint):longint; var i,j:longint; begin a[l]:=x; check:=1; for i:=1 to l div 2 do begin for j:=1 to i do if a[l-j+1]<>a[l-i-j+1] then inc(bz); if bz=0 then check:=0; bz:=0; end; a[l]:=0; end; procedure print; var i:longint; begin inc(tj); for i:=1 to n do if a[i]=1 then write('A') else if a[i]=2 then write('B') else write('C'); writeln; end; procedure search(dep:longint); var i,j:longint; begin if dep>n then begin print; exit; end; for i:=1 to 3 do if check(i,dep)=1 then begin a[dep]:=i; search(dep+1); a[dep]:=0; end; end; begin read(n);tj:=0; fillchar(a,sizeof(a),0); search(1); write(tj); end.