动态数组中的每个元素,两两组合、三三组合。。。。。。,组合排列问题

terrywolf 2014-05-29 09:01:12
各位大神,请教个问题。
动态数组中的每个元素(元素个数N不定,最多10个),两两组合、三三组合、NN组合。。。。。。,然后再排列。就是所有组合的所有排列。
例如:数组a(10)中有东、西、南、北、中、发、白。。。。。。
两两组合成:东西、西东、东南、南东。。。。。。
三三组合:东西南、东南西、西南东、西东南、南东西、南西东
中发白、中白发、发白中、发中白、白发中、白中发
。。。。。。
四四组合:。。。。。。
NN组合:。。。。。。

然后生成的组合存储在一个txt文档中。
...全文
1119 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Treenewbee 2014-06-21
  • 打赏
  • 举报
回复
递归即可
Dim t
Private Sub Command1_Click()
Dim arr() As String, i As Long
t = Split("东、西、南、北、中、发、白", "、")
Open "d:\MJ.TXT" For Output As #1
For i = 2 To UBound(t) + 1
getall UBound(t), i, "", arr
Print #1, Join(arr, ",") & vbCrLf

Next
Close #1
MsgBox "OK"
End Sub


Sub getall(ByVal m As Byte, ByVal n As Byte, ByRef a As String, ByRef arr() As String, Optional ByRef count As Long)
    If Len(a) = n Then
        count = count + 1
        ReDim Preserve arr(1 To count)
        arr(count) = a
        Exit Sub
    End If
    For i = 0 To m
        If InStr(a, t(i)) = 0 Then getall m, n, a & t(i), arr, count
    Next i
End Sub
赵4老师 2014-05-29
  • 打赏
  • 举报
回复
仅供参考,尽管是C语言:
//qplw.cpp
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int v=0;
int w=0;
int m;//记录字符串长度
int n;//记录字符串中的字符种类数
char map[256];//记录是哪几种字符
int count[256];//记录每种字符有多少个
int stack[1000];//递归用的栈,并记录当前生成的排列
void Make_Map(char *str) {//统计字符串的相关信息
    int s[256];
    int i;
    memset(s,0,sizeof(s));
    memset(count,0,sizeof(count));
    m=strlen(str);
    if (w<1 || m<w) w=m;
    while(*str) {
        s[*str]++;
        str++;
    }
    n=0;
    for (i=0;i<256;i++)
        if (s[i]) {
            map[n]=i;
            count[n]=s[i];
            n++;
        }
}
void Find(int depth) {//递归式回溯法生成全排列
    if (depth==w) {
        int i;
        for (i=0;i<depth;i++) putchar(map[stack[i]]);
        putchar('\n');
    } else {
        int i;
        if (v && depth>0) {
            for (i=0;i<depth;i++) putchar(map[stack[i]]);
            putchar('\n');
        }
        for (i=0;i<n;i++)
            if (count[i]) {
                stack[depth]=i;
                count[i]--;
                Find(depth+1);
                count[i]++;
            }
    }
}
void main(int argc,char**argv) {
    if (argc<2) {
        printf("%s 要产生全排列的字符串 [限定长度|-1]\n",argv[0]);
        return;
    }
    if (argc>=3) w=atoi(argv[2]);
    if (-1==w) v=1;
    Make_Map(argv[1]);
    Find(0);
}
//C:\test>qplw
//qplw 要产生全排列的字符串 [限定长度|-1]
//
//C:\test>qplw 123
//123
//132
//213
//231
//312
//321
//
//C:\test>qplw 123 2
//12
//13
//21
//23
//31
//32
//
//C:\test>qplw 122333 3
//122
//123
//132
//133
//212
//213
//221
//223
//231
//232
//233
//312
//313
//321
//322
//323
//331
//332
//333
//
//C:\test>qplw 123 -1
//1
//12
//123
//13
//132
//2
//21
//213
//23
//231
//3
//31
//312
//32
//321
//
bcrun 2014-05-29
  • 打赏
  • 举报
回复
看起来好像是个麻将游戏哦

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧