回 帖 发 新 帖 刷新版面

主题:大虾们,救命啊!

任意输入M个字符,编程输出任取N个字符的所有情况。(M>=N)

比如
M=5,N=2
字符串输入:ASDFG
输出
AS AD AF AG SA SD SF SG DA DS DF DG FA FS FD FG GA GS GD GF
高手出来

回复列表 (共14个回复)

沙发

[em11][em13]

板凳

补充
比如
M=5,N=2
字符串输入:ASDFG
输出
AS AD AF AG SA SD SF SG DA DS DF DG FA FS FD FG GA GS GD GF
高手出来

3 楼

乍一看好象简单,不过做起来有点问题,
我的思路是如果取N个字符应该是N重循环哪,
不过好象N重循环难以用变量控制的哪,所以对这个不确定的N我觉得好头大,
呵呵,我的思路只能对付确定的N啦,
兄弟!看来我的水平是不足以帮你了,望你见谅!请高手吧.
不好意思哪,本来说好晚上把他做出来.
请各位大虾来帮帮忙哪,我知道这里好多高手的,
提个思路也行!

4 楼

顶、!

5 楼

我觉得这个有点像染色问题
m为颜色数
n为块数

6 楼

按你例子的意思不止是取出来,还要进行排列,取出了‘AB’,全排列得到‘AB’、‘BA’。

如果不要求速度,我到有个方法。但是速率不高,没有直接套For循环的高。如果只是取出来,更简单了。

7 楼

我做出来了,看这个结果:

从"ABCDEF"中选3个的全部排列如下:
ABC
ABD
ABE
ABF
ACB
ACD
ACE
ACF
ADB
ADC
ADE
ADF
AEB
AEC
AED
AEF
AFB
AFC
AFD
AFE
BAC
BAD
BAE
BAF
BCA
BCD
BCE
BCF
BDA
BDC
BDE
BDF
BEA
BEC
BED
BEF
BFA
BFC
BFD
BFE
CAB
CAD
CAE
CAF
CBA
CBD
CBE
CBF
CDA
CDB
CDE
CDF
CEA
CEB
CED
CEF
CFA
CFB
CFD
CFE
DAB
DAC
DAE
DAF
DBA
DBC
DBE
DBF
DCA
DCB
DCE
DCF
DEA
DEB
DEC
DEF
DFA
DFB
DFC
DFE
EAB
EAC
EAD
EAF
EBA
EBC
EBD
EBF
ECA
ECB
ECD
ECF
EDA
EDB
EDC
EDF
EFA
EFB
EFC
EFD
FAB
FAC
FAD
FAE
FBA
FBC
FBD
FBE
FCA
FCB
FCD
FCE
FDA
FDB
FDC
FDE
FEA
FEB
FEC
FED


我是用VB写的,明天再改成QB的。

8 楼

嘿嘿,我用C,写的!TC2.0

int m=5,n=3;
char xxx[]={"12345678"},b[1000];
int a[1000],c[1000];

main()
  {
    int j;
    void qq(int x);
    for(j=0;j<m;j++,a[j]=0);
    qq(n-1);
  }

void qq(int x)
  {    int i,j;

    for( c[x]= 0; c[x]<m; c[x]++)
      {
        if ( a[c[x]]==1) continue;
        a[c[x]]=1;
        b[x] = xxx[c[x]];
        if (x>0)
        qq(x - 1);

          else if (x==0)
        {
        for(j=n-1;j>=0;j--)
            printf("%c", b[j]);
        printf(" ");

        }
         a[c[x]]=0;
      }
  }

9 楼

终于OK了,好困啊!!!

DECLARE SUB QQ (x)
DIM SHARED m, n AS INTEGER
DIM SHARED a(1 TO 100) AS INTEGER    '所有数组的长度,>M即可
DIM SHARED c(1 TO 100) AS INTEGER
DIM SHARED b(1 TO 100) AS STRING
DIM SHARED q$

CLEAR : CLS
    m = 5: n = 2                 'm、n、q$ 根据实际要求进行改变
    q$ = "ASDFGH"

    x = n
    CALL QQ(x)
END

SUB QQ (x)
       
    c(x) = 1
    DO
        IF (a(c(x)) = 1) THEN GOTO continue
        a(c(x)) = 1
        b(x) = MID$(q$, c(x), 1)
        IF x > 1 THEN
        CALL QQ(x - 1)
        ELSEIF x = 1 THEN
        FOR j = n TO 1 STEP -1
        PRINT b(j);
        NEXT j
        PRINT " ";
        END IF

        a(c(x)) = 0
continue:  
        c(x) = c(x) + 1
    LOOP WHILE c(x) <= m

END SUB

10 楼

你是怎么算的?能讲解一下吗?

我来回复

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