如何用程序实现组合生成?? (300分)

  • 主题发起人 主题发起人 cdl
  • 开始时间 开始时间
C

cdl

Unregistered / Unconfirmed
GUEST, unregistred user!
给个例子吧!要源代码,用delphi.
例如有N个变量,每个变量可取1,0,或是-1,用程序有规律的列出所有可能的情况!
 
3的N次方,排列组合
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var N:integer;
line:string;
procedure getdata(x:integer);
var i:integer;
temp:string;
begin
temp:=line;
for i:=-1 to 1do
begin
line:=temp;
line:=IntToStr(i)+line;
if x=1 then
begin
Memo1.Lines.Add(line);
line:='';
end
else
getdata(x-1);
end;
end;
begin
N:=5;
getdata(N);
end;
end.
 
可惜上面的源代码只能处理N<=8或9的情况,如何人改善?
 
Memo换成RichEdit
 
用一个嵌套循环即可解决了。
比如有3个变量:
var
int_i,int_j,int_k:integer;
************************
richedit1.lines.clear;
for i:=-1,0do
begin
for j:=-1,1do
begin
for k:=-1,1do
begin
richedit1.lines.add(inttostr(i)+','+inttostr(j)+','+inttostr(k));
end;
end;
end;

其实这种东西只要学一点初级的概率论即可解决问题。
 
zhhc兄的递归办法,确实只能处理N<8的情况。
即算是换成RichEdit。
因为3^10=59049,堆栈再大也无济于事。
angel1的办法只能对n比较小,写n层循环嵌套。
n=20就不爽啦。
 
n>20的时候自己模拟一个栈就可以了。
RichEdit的容量不够,可以先输出到文件中,再一块一块的显示出来。
给个简单的程序
Const
N = 30;
MaxValueItem = 10;
{ 假定变量取值为10种 }
Var
Stack : Array[1..N] of integer;
{栈}
V : Array[1..MaxValueItem ] of integer;
{各个变量的值}
i : integer;
{栈指针}
p : Integer;
{变量值指针}
begin
ValueItem[1] := ?;
.... ?ValueItem[10] := ? ;
{给变量值数组赋初值}
i := 0;
{指向栈顶,空栈}
p := 0;
repeat
p := p + 1;
if p>ValueItem then
{如果所有 变量值 都已经试完}
begin
{退栈}
if i>1 then
p := stack[i-1];
i := i -1;

end
else
if i<N then
{如果还有 变量 没有赋值}
begin
{进栈}
i := i + 1;
stack := p;
{注意:栈中保存的仅仅是 变量值 的位置}
p := 0;
end
else
输出结果到文件;
until i=0;

end.




 
cdl:请自己提前或结束帖子,谢谢合作。
 
套用回溯法的框架就可以了
program CArray;
{$APPTYPE CONSOLE}
uses SysUtils;
type TCArray=class
private
arr:array [1..100] of integer;
f:text;
public
procedure makeResultFile(finename:string;n:integer;m:integer);
end;

var CArr:TCArray;
{ CArray }
procedure TCArray.makeResultFile(finename: string;
n: integer;m:integer);
var
p,i:integer;
begin
assign(f,finename);
rewrite(f);
p:=1;
fillchar(arr,sizeof(arr),0);
while p>=1do
//p=0时则说明已搜索完毕
begin
inc(arr[p]);
if arr[p]>m then
begin
dec(p);
//回溯
end
else
begin
if p=n then

begin
//产生一个结果
for i:=1 to ndo
write(f,arr,' ');
writeln(f);
end
else
begin
//继续搜索
inc(p);
arr[p]:=0;
end
end;
end;
closefile(f);
end;

begin
// Insert user code here
CArr:=TCArray.Create;
CArr.makeResultFile('test1.txt',5,3);
FreeAndNil(CArr);
end.
 
cdl:如果要继续请提前,否则请结束问题,谢谢
 
这个题是在考验存储空间和内存,还有必要讨论吗?
[:(!]
 
请看 http://www.delphibbs.com/delphibbs/dispq.asp?lid=0999248
请尽快结束您的帖子,谢谢合作!
 
多人接受答案了。
 
后退
顶部