一个关于全排列的问题 (高分)

wangxianzhi 2004-03-31 03:40:51
选择任意几个数字(如:5,8,11,12,16).实现其全排列.请大家赐教.本人急须.
...全文
82 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
northwolves 2004-04-07
  • 打赏
  • 举报
回复
不错,比我写的代码快多了,收藏。
flyingscv 2004-04-02
  • 打赏
  • 举报
回复
那个结果可以用来做数组下标的
你实际是什么都无所谓
wangxianzhi 2004-04-02
  • 打赏
  • 举报
回复
兄弟们呀
你们以上都没有明白我的意思.
一个数字不能在一个排列中有多次出现的机会.看清楚了.并且数字可以是不连续的.如9,12,48,11等

我想要的结果是:
比如有1,2,3 三个数。程序执行结果是:
123,132,213,231,312,321
每一个结果都是三位数。并且这些数字都是唯一的
VertyNew 2004-04-02
  • 打赏
  • 举报
回复
给你个简单的算法

Dim I As Integer '用作数组下标
Dim J As Integer '用作循环输出
Dim n As Integer '记载数组个数
Dim a() As Integer '记载数组下标
Dim b() As Integer '记载使用标识
n = 4 '假使数组共有四个元素
ReDim a(n)
ReDim b(n)
I = 1 '假使数组下标从1开始
a(1) = 0
Do While I <= n
a(I) = a(I) + 1
If a(I) <= n Then
If b(a(I)) = 0 Then
If I = n Then '达到数组末,则输出组合情况
'这里只输出数组下标,可使用Array(s(J))的方式输出数组内容
For J = 1 To n
Text1.SelText = a(J) & " "
Next
Text1.SelText = vbCrLf
I = I - 1
b(a(I)) = 0 '清空使用标识
Else
b(a(I)) = 1 '标记已使用
I = I + 1
a(I) = 0 '重查
End If
End If
Else
I = I - 1
If I = 0 Then Exit Do '回溯至数组前则结束
b(a(I)) = 0
End If
Loop
满意吗?
northwolves 2004-04-02
  • 打赏
  • 举报
回复
不符合你的要求?

Private Sub Command1_Click()
Dim a(4) As String, temp As String
a(0) = 9
a(1) = 12
a(2) = 48
a(3) = 11
a(4) = 29
temp = permutation(a, UBound(a))
'temp = Replace(temp, ",", "")
Debug.Print temp
Debug.Print "共有 " & UBound(Split(temp, vbCrLf)) + 1 & " 种排法!"
End Sub


Function addxtostr(ByVal x0 As String, ByVal xadd As String) As String
Dim temp, temp2, all() As String, i As Long
temp = Split(x0, ",")
ReDim all(UBound(temp) + 1)
all(0) = xadd & "," & x0
For i = 1 To UBound(all)
temp2 = temp
temp2(i - 1) = temp2(i - 1) & "," & xadd
all(i) = Join(temp2, ",")
Next
addxtostr = Join(all, vbCrLf)
Set temp = Nothing
Set temp2 = Nothing
Erase all
End Function

Function permutation(ByRef a() As String, ByVal n As Long) As String
Dim i As Long, temp, all() As String
If n = 1 Then permutation = a(0)
If n = 2 Then permutation = a(0) & "," & a(1) & vbCrLf & a(1) & "," & a(0)
If n > 2 Then
temp = Split(permutation(a, n - 1), vbCrLf)
ReDim all(UBound(temp))
For i = 0 To UBound(temp)
all(i) = addxtostr(temp(i), a(n - 1))
Next
permutation = Join(all, vbCrLf)
End If
Erase all
End Function

northwolves 2004-03-31
  • 打赏
  • 举报
回复
递归解决:

Private Sub Command1_Click()
Dim a(8) As String, temp As String
For i = 0 To 8
a(i) = i
Next
temp = permutation(a, UBound(a))
Debug.Print temp
Debug.Print "共有 " & UBound(Split(temp, vbCrLf)) + 1 & " 种排法!"
End Sub


Function addxtostr(ByVal x0 As String, ByVal xadd As String) As String
Dim temp, temp2, all() As String, i As Long
temp = Split(x0, ",")
ReDim all(UBound(temp) + 1)
all(0) = xadd & "," & x0
For i = 1 To UBound(all)
temp2 = temp
temp2(i - 1) = temp2(i - 1) & "," & xadd
all(i) = Join(temp2, ",")
Next
addxtostr = Join(all, vbCrLf)
Set temp = Nothing
Set temp2 = Nothing
Erase all
End Function

Function permutation(ByRef a() As String, ByVal n As Long) As String
Dim i As Long, temp, temp1, temp2, temp3, all() As String
If n = 0 Then permutation = a(0)
If n = 1 Then permutation = a(0) & "," & a(1) & vbCrLf & a(1) & "," & a(0)
If n > 1 Then
temp = Split(permutation(a, n - 1), vbCrLf)
ReDim all(UBound(temp))
For i = 0 To UBound(temp)
all(i) = addxtostr(temp(i), a(n - 1))
Next
permutation = Join(all, vbCrLf)
End If
Erase all
End Function
flyingscv 2004-03-31
  • 打赏
  • 举报
回复
不看结果的话
' For i = 1 To Total
' Text1.Text = Text1.Text & "-" & A(i)
' Next i
' Text1.Text = Text1.Text & vbCrLf
这样,不然很慢
flyingscv 2004-03-31
  • 打赏
  • 举报
回复
Const Total As Long = 4
改这个设置排列个数
不要太大啊,大了会溢出的
flyingscv 2004-03-31
  • 打赏
  • 举报
回复
Option Explicit

Private Sub Command1_Click()
Const Total As Long = 4
Dim A(Total) As Long '各位取值
Dim Flag(Total) As Long '表示取值次数
Dim i As Long, j As Long, k As Long, l As Long
Dim S As Long, Count As Long
Dim Exist As Boolean

For i = 1 To Total
Flag(i) = 1
A(i) = i
Next i

S = 1
For i = 2 To Total
S = S * i
Next i

For i = 1 To Total
Text1.Text = Text1.Text & "-" & A(i)
Next i
Text1.Text = Text1.Text & vbCrLf
Count = 1

Do
For i = Total To 1 Step -1
If Flag(i) < Total - i + 1 Then

Exist = False
For j = A(i) + 1 To Total
For k = 1 To i - 1
If A(k) = j Then
Exist = True
Exit For
End If
Next k
If Not Exist Then
A(i) = j
Exit For
End If
Next j
Flag(i) = Flag(i) + 1

For l = i + 1 To Total
For j = 1 To Total
Exist = False
For k = 1 To l - 1
If A(k) = j Then
Exist = True
Exit For
End If
Next k
If Not Exist Then
A(l) = j
Exit For
End If
Next j
Flag(l) = 1
Next l

Exit For
End If
Next i

For i = 1 To Total
Text1.Text = Text1.Text & "-" & A(i)
Next i
Text1.Text = Text1.Text & vbCrLf

Count = Count + 1
Loop While Count < S
End Sub

加个commandbox textbox mutilline=true就可以看效果了
华芸智森 2004-03-31
  • 打赏
  • 举报
回复

这是C++的一个例子

#define N 21
#include <stdio.h>
#include <string.h>

// 声明。
char d[N];
void Permutation(char s[], int i, int l);
void Sort(char s[]);
int count = 0;

void main()
{
char s[N];

// 输入源字符串。
printf("请输入一个不超过20个字符的字符串:");
gets(s);

// 排序,排列并输出。
Sort(s);
Permutation(s, 0, strlen(s));
}

// 运用递归输出各种排列。
void Permutation(char s[], int i, int n)
{
int j;
char temp;
for(j = 0; j < n; j ++)
if(s[j] == s[j - 1])
;
else if(s[j] != '#')// 如果标志为不为'#',
{
d[i] = s[j];// 把源串的一个字符赋给目的串。
temp = s[j];
s[j] = '#';
if(i == n - 1)
{
d[n] = '\0';
printf("%d:", ++ count); // 打印出其结果。
puts(d);
}
else Permutation(s, i + 1, n);// 递归调用。
s[j] = temp;// 回溯。
}
}

// 排序。
void Sort(char s[])
{
int n = strlen(s);
int i, j;
char temp;
for(i = 0; i < n - 1; i ++)
for(j = i + 1; j < n; j ++)
if(s[i] > s[j])
{
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
ZhangYv 2004-03-31
  • 打赏
  • 举报
回复
倒~~~没有一个正题的...

这里是一个求全排列的:
http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=2987

这是求组合的算法:
http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=186476
northwolves 2004-03-31
  • 打赏
  • 举报
回复
递归解决
wangxianzhi 2004-03-31
  • 打赏
  • 举报
回复
我觉得也难呀,写了这么久的程序的算法上真是没怎么动脑筋。实在没办法还是得自己
动手了。唉。。。。。兄弟们呀。。。救命呀。。。
kmzs 2004-03-31
  • 打赏
  • 举报
回复
我还以为是阶乘问题,应该用树状排列法枚举,不过我水平不够写不来。。。
wangxianzhi 2004-03-31
  • 打赏
  • 举报
回复
是呀,可是这两天脑袋都被搞得麻木了,看着问题都是呆的。已经不会转了。
有没有哪会兄弟脑袋转得快一点的呀。帮个忙噻
victorycyz 2004-03-31
  • 打赏
  • 举报
回复

网上很多算法的,搜一下吧,不过多半不是VB代码。
wangxianzhi 2004-03-31
  • 打赏
  • 举报
回复
我再看看。
wangxianzhi 2004-03-31
  • 打赏
  • 举报
回复
你这只是一个排序问题吧?
我想要的结果是:
比如有1,2,3 三个数。程序执行结果是:
123,132,213,231,312,321
每一个结果都是三位数。并且这些数字都是唯一的。
华芸智森 2004-03-31
  • 打赏
  • 举报
回复
兄弟,对不起!!俺经常是看题目就回贴.不经大脑.SORRY!
下面是一篇C算法的文章,你可以轻易将其改写为VB.

http://www.csdn.net/develop/article/22/22071.shtm
射天狼 2004-03-31
  • 打赏
  • 举报
回复
楼上的哥们,楼主要的是排列组合后的所有情况,不是排序`~~~~
加载更多回复(1)

7,763

社区成员

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

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