字符序列pascal程序

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.


posted @ 2016-12-22 20:43  银叶草  阅读(211)  评论(0编辑  收藏  举报
Live2D