请高手帮忙,感激不尽!! ( 积分: 50 )

  • 主题发起人 蓝色大海
  • 开始时间

蓝色大海

Unregistered / Unconfirmed
GUEST, unregistred user!
问题如下:
有12个数字1到12(类型为整形),如何将它们的所有排列都列出来,我想到的一个办法是用12个嵌套循环,但效率不高,共有12!种可能,效率太低,请问高手有没有更好的办法实现,谢谢!!!
 

蓝色大海

Unregistered / Unconfirmed
GUEST, unregistred user!
问题如下:
有12个数字1到12(类型为整形),如何将它们的所有排列都列出来,我想到的一个办法是用12个嵌套循环,但效率不高,共有12!种可能,效率太低,请问高手有没有更好的办法实现,谢谢!!!
 

无有人

Unregistered / Unconfirmed
GUEST, unregistred user!
好像只能这样...
 
A

ak_2005

Unregistered / Unconfirmed
GUEST, unregistred user!
谁说的,一个循环就可以了.
 

蓝色大海

Unregistered / Unconfirmed
GUEST, unregistred user!
一个循环怎么能实现呢?
 
A

ak_2005

Unregistered / Unconfirmed
GUEST, unregistred user!
集合操作
 
D

dongy_143

Unregistered / Unconfirmed
GUEST, unregistred user!
牵扯到概率问题,把概率里的公式代入到DELPHI里不就行了;
没有深入研究....
帮你顶
 
A

ak_2005

Unregistered / Unconfirmed
GUEST, unregistred user!
概率?!没听错吧,这里要的是准确,不是什么概率.
楼主,方法我已经说了不会让我写代码吧(一个循环+集合的减操作).
 

完美动物

Unregistered / Unconfirmed
GUEST, unregistred user!
to ak_2005
"集合的减操作"是个什么意思啊?
可以说一下下吗?
[:(]
 

蓝色大海

Unregistered / Unconfirmed
GUEST, unregistred user!
是这样的,我想把这不同的排列放进一个一维数组中,请问ak_2005如何实现啊?
 
H

hs-kill

Unregistered / Unconfirmed
GUEST, unregistred user!
这个和效率有什么关系,又不是排序
不过冒泡排序的算法用在这里应该合适。。。嘿嘿 等下我去写个看看
 
D

dongy_143

Unregistered / Unconfirmed
GUEST, unregistred user!
to:ak_2005
你学过概率统计与算法么?
里面有没有给一个数,让你列出他的所有排列;
你这都不知道还谈什么深入编程??
 
D

dongy_143

Unregistered / Unconfirmed
GUEST, unregistred user!
以下的供参考,但基本可以实现你的功能:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TConfusion=class
private
FInputStr:string;
FOutputList:TStringList;
class procedure Swap(var a:char ;
var b:char);overload;
procedure Perm(s:string;first,last:LongInt);
function GetOutputList:TStringList;
public
Constructor Create(str:string='');
destructor Destroy;
override;
published
property InputStr:string read FInputStr write FInputstr;
property OutputList:TStringList read GetOutputList write FOutputList;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TConfusion.Swap(var a:char ;
var b:char);
var
t:char;
begin
t:=a;
a:=b;
b:=t;
end;
procedure TConfusion.Perm(s:string;first,last:LongInt);
var
i:integer;
begin
if first=last then
begin
if FOutputList.IndexOf(s)=-1 then
begin
FOutputList.Add(s);
end;
end
else
begin
for i:=first to lastdo
begin
Swap(s[first],s);
Perm(s,first+1,last);
Swap(s[first],s);
end;
end;
end;
Constructor TConfusion.Create(str:string='');
begin
FOutputList:=TStringList.Create;
FInputStr:=str;
end;
destructor TConfusion.Destroy;
begin
FOutputList.Free;
end;
function TConfusion.GetOutputList:TStringList;
begin
if FInputStr='' then
Raise Exception.Create('字符串为空');
Perm(FInputStr,1,Length(FInputStr));
Result:=FOutputList;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
cf:TConfusion;
begin
cf:=TConfusion.Create(edit1.Text);
memo1.Text:= cf.OutputList.Text;
cf.Free;
end;
end.
 
A

ak_2005

Unregistered / Unconfirmed
GUEST, unregistred user!
todo
ngy_143:
学过,学的不好,其他不想多说.
什么叫概率?什么叫组合?什么叫排列?
他这个是确定的怎么扯上概率了??
 
A

ak_2005

Unregistered / Unconfirmed
GUEST, unregistred user!
//好吧,我就用数组来实现吧
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure compose(var arr: array of integer;
size, pos: integer);
procedure display(var arr: array of integer;
n: integer);
end;

var
Form1: TForm1;
implementation
var
arr: array [0..11] of integer =(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
{$R *.dfm}
{ TForm1 }
procedure TForm1.compose(var arr: array of integer;
size, pos: integer);
var
i, tmp: integer;
begin
if (pos + 1 = size) then
begin
display(arr, size);
Exit;
end;
for i := pos to size - 1do
begin
tmp := arr[pos];
arr[pos] := arr;
arr := tmp;
compose(arr, size, pos + 1);
tmp := arr[pos];
arr[pos] := arr;
arr := tmp;
end;
end;

procedure TForm1.display(var arr: array of integer;
n: integer);
var
i: integer;
str: string;
begin
str := '';
for i := 0 to n - 1do
begin
str := str + IntToStr(arr) + '';
end;
Memo1.Lines.Add(str);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
compose(arr, 4, 0);
//更改中间这个数字就可以了
end;

end.
 
A

ak_2005

Unregistered / Unconfirmed
GUEST, unregistred user!
最后还说句吧,上面我说错了,用一个循环和集合操作是实现不了的,我已经仔细分析过了.
上面的方法用的是递归(dongy_143也是).
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
960
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
顶部