算法通用性扩展问题,请教高手(100分) ( 积分: 100 )

  • 主题发起人 主题发起人 peerson
  • 开始时间 开始时间
P

peerson

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个问题,在3个位置上,每个位置各有N1,N2,N3个元素,在每个位置上各取一个,求所有的结果?
3个位置的简单算法:
...
OutStr:='';
for i:=1 to N1do
begin
for j:=1 to N2do
begin
for k:=1 to N3do
OutStr:=A+B[j]+C[k];
end;
end;

现在遇到的问题是,如果位置为4,5,6,7,8,9.....甚至10的时候,就不能这么写了,太多的循环层,而且可读性也不好,请各位大富翁给个好的通用算法,本人菜鸟一个,递归、回溯统统没入门,呜呜~~~
 
有一个问题,在3个位置上,每个位置各有N1,N2,N3个元素,在每个位置上各取一个,求所有的结果?
3个位置的简单算法:
...
OutStr:='';
for i:=1 to N1do
begin
for j:=1 to N2do
begin
for k:=1 to N3do
OutStr:=A+B[j]+C[k];
end;
end;

现在遇到的问题是,如果位置为4,5,6,7,8,9.....甚至10的时候,就不能这么写了,太多的循环层,而且可读性也不好,请各位大富翁给个好的通用算法,本人菜鸟一个,递归、回溯统统没入门,呜呜~~~
 
打个记号,今天的活结束了写一个试试。
 
你的意思是要求一个咚咚的排列组合吗?
有点看不明白你的描述。
 
不明白你的意思:
如果是M行;N列. 我觉得用动态数组最合适:
type
A=array of array ofdo
uble;
在这里 OnClik这样写:
==========
begin
setLength(A,m,n);
begin
for i:=0 to mdo
begin
for j:=0 to ndo
end;
end;
ShowMessge("成功!");
=========
这是二维的;
多维的也可以实现!
 
to listhano:
请看清题目,要求是通用性扩展,俺虽是菜鸟,但还不至于动态数组也不知道吧,呵呵。
我要的是当位置数变化的时候,函数或过程的通用性,也就是说,当位置情况为任意值的时候(例子中的位置为3),也能得到正确的结果。
如果用循环,恐怕是实现不了的。
to kkkchenA:
实质上就是从M个盒子中(盒子中的球数不等),每盒子取一个球的排列问题。要求是M为任意值,函数或过程都适用。
 
顶上去!
 
1、看看我的思路
TBall = record
ID: Integer;
..
end;
TBox = array of TBall;
//盒子
TAllBox = array of TBox;
//所有盒子
var
AllBox: TAllBox;

IntAllBox;
//初始化所有盒子及盒子里的球
function GetBallArrangement(value: TAllBox): strings;
var
i, j, k: Integer;
begin
Result := TStringList.Create;
for i := Low(value) to High(value)do

for j := Low(value) to High(value)do
Result.Append(IntToStr(i) + IntToStr(j) + IntToStr(value[j].ID));
end;
 
to nicai_wgl:
你的输出结果似乎不符合题意。是每个盒子里取一个球,跟盒子标号无关。
 
三步:
1、每个位置各有N个元素:TStringList串列
2、N个位置:TList队列
3、按照循环队列、串列的方式,马马虎虎吧
 
给一个简单递归的
var sList:TStrings;
sResult:TStrings;
k:integer;
s:string;
procedure GetIndex(t:integer;
ss:string);
var i,j:integer;
begin
if t=iCount then
begin
//增加一个结果
sResult.Add(ss);
exit;
end;

for i:=1 to Length(sList.Strings[t])do
//循环每一个位置上所有的元素
begin
ss[t+1]:=sList.Strings[t];
GetIndex(t+1,ss);
//递归
end;
end;

begin
//数据初始化
sResult:=TStringList.Create;
sList:=TStringList.Create;
sList.Add('XXXXXXXXXX');
//第1个位置元素列表
sList.Add('XXXXXXXXXX');
//第2个位置元素列表
……
sList.Add('XXXXXXXXXX');
//第n个位置元素列表
//构造一个n个空格的字符串
s:='';
for k:=1 to sList.Countdo
s:=s+' ';
//执行递归
GetIndex(0,s);

//输出结果
showmessage(sResult.Text);

//释放
FreeAndNil(sList);
FreeAndNil(sResult);
end;
 
这个问题用递归自行解决了,感谢大家的热心,其中plenilune168朋友的方法能满足要求,给50分,其他的朋友都给10分略表心意吧。
 
后退
顶部