回 帖 发 新 帖 刷新版面

主题:sos!!!!!!

液晶屏显示的十个阿拉伯数字(7笔划),这里把横和竖的一个短划都称为一笔,如7有3笔,8有7笔。编一个程序,重新排列10个数,使其相邻数字都可以由另一个数字加上几笔或减去几笔组成(如:4107395682),但不能又加又减。打印出所有可能的排列方法。
输出格式:
一行一个排列,要求按照字符串从小到大的顺序输出,格式如下:
0731495682
2807314956
2837014956
……
顺便求救几道难题,在上传里。

回复列表 (共5个回复)

沙发

把可以转换之间的两个数的信息进行打表,然后搜索

板凳

要程序

3 楼

好不容易做出来了,
这道对1楼很简单的题对我还是很难的!
{$N+}
TYPE
   {Integer type declare}
   I_ = INTEGER;
   SI_ = SHORTINT;
   LI_ = LONGINT;
   BI_ = BYTE;
   WI_ = WORD;
   {Real type declare}
   R_ = REAL;
   SR_ = SINGLE;
   DR_ = DOUBLE;
   ER_ = EXTENDED;
   CR_ = COMP;
   {Other type declare}
   C_ = CHAR;
   B_ = BOOLEAN;
   S_ = STRING;
   a1_ = 0..9;
CONST
    nbin: ARRAY[a1_] OF STRING[7] =
    ('1110111',
     '0010010',
     '1011101',
     '1011011',
     '0111010',
     '1101011',
     '1101111',
     '1010010',
     '1111111',
     '1111011');
VAR
   cz: ARRAY[a1_] OF STRING[9];
   cznum: ARRAY[a1_] OF a1_;
   sss1: ARRAY[a1_] OF a1_;
   sss2: ARRAY[a1_] OF a1_;
PROCEDURE print;
VAR
   i: a1_;
BEGIN
    FOR i:=0 TO 9 DO WRITE(sss1[i]);
    WRITELN;
END;
FUNCTION kc(ss1, ss2: S_): B_;
VAR
   i: 1..7;
BEGIN
    FOR i:=1 TO 7 DO
        IF ss1[i] = '1' THEN
           IF ss2[i] <> '1' THEN BEGIN kc := FALSE; EXIT; END;
    kc := TRUE;
END;
VAR
   i, j, kk, p, nm, v: a1_;
   ss0: S_;
   fl: B_;
BEGIN
    FOR i:=0 TO 9 DO
        FOR j:=0 TO 9 DO
            IF i <> j THEN
               IF (kc(nbin[i], nbin[j])) OR (kc(nbin[j], nbin[i])) THEN BEGIN
                  INC(cznum[i]);
                  cz[i] := cz[i] + CHR(48 + j);
               END;
    WRITELN('0731495682');
    FOR i:=0 TO 9 DO BEGIN
        FILLCHAR(sss1, SIZEOF(sss1), 0);
        j := 0;
        p := 0; sss1[0] := i; ss0 := cz[i]; nm := cznum[i];
        REPEAT
             INC(j);
             IF j <= nm THEN BEGIN
                v := ORD(ss0[j]) - 48; fl := TRUE;
                FOR kk:=0 TO p DO IF sss1[kk] = v THEN BEGIN
                    fl := FALSE; BREAK;
                END;
                IF fl THEN BEGIN
                   INC(p); sss1[p] := v; sss2[p] := j; j := 0;
                   ss0 := cz[v]; nm := cznum[v];
                   IF p = 9 THEN print;
                END;
             END ELSE BEGIN
                j := sss2[p]; DEC(p);
                ss0 := cz[sss1[p]];
                nm := cznum[sss1[p]];
             END;
        UNTIL p = 0;
    END;
END.

4 楼

哈哈..如果每行代码两元那不赚翻了

5 楼

嫌我的代码长是不是?

你就直接把所有的答案打印下来就行了,这样就短了。

不过LZ不会照顾你的。

告诉LS:来这个论坛是赚分的,不是缩减代码的!!!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册