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.