ListBox排列組合問題 |
答題得分者是:richtop
|
Sei
一般會員 發表:22 回覆:38 積分:17 註冊:2002-05-22 發送簡訊給我 |
各位前輩:
我在http://delphi.ktop.com.tw/topic.php?TOPIC_ID=56355這裡有上傳求助程式 裡面是透過Listbox做排列組合,有用到站長的一隻function NClass(階層)
原本設計是讓使用者按▲▼去做數字的調整
後來改成自動調整,就必需用到排列組合
不知道是不是我數學太差了
排出來的結果好像不太一樣,會有重覆的情況發生
弄了很久還是搞不清楚卡在哪裡
之前是ListBox裡只有四項,run出來的好像沒錯
可是變成五項時,問題就出現了
不知是否可請前輩們幫我check一下呢?
非常謝謝~
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
Sei 您好: 不好意思,我沒有去理解您程式的內容,而直接用我的方法去做,提供您參考。
有一個很簡單的方法,至少可以判斷排列的結果是否正確?
class="code">
// str:要做排列的資料; k:要取出多少個來作排列; idx:目前處理的位置
// 例如: permutation('abc', 3, 1) => abc, acb, bac, bca, cab, cba
procedure TForm1.permutation(str: string; k, idx : integer);
var
p, n : integer;
ch : char;
begin
n := Length(str);
if ( idx=k ) then
begin
for p:=idx to n do
begin
ch := str[k];
str[k] := str[p];
str[p] := ch;
Memo1.Lines.Add( Copy(str, 1, k) );
end;
end
else
for p:=idx to n do
begin
ch := str[idx];
str[idx] := str[p];
str[p] := ch;
permutation(str, k, idx 1);
end;
end; procedure TForm1.Button2Click(Sender: TObject);
var
number, perm, msg : string;
k, p, idx : integer;
begin
number := '0123456789';
Memo1.Lines.Clear;
perm := Copy(number, 1, lsb_DIG.Items.Count); // 決定多少個需要排序
permutation(perm, lsb_DIG.Items.Count, 1); // 取得所有的排列,暫存於Memo1中 for k:=0 to Memo1.Lines.Count-1 do // 依序取出可能排列,並將對應的結果show出
begin
perm := Memo1.Lines.Strings[k];
msg := '';
for p:=1 to Length(perm) do
begin
idx := ord(perm[p]) - ord('0');
msg := msg ' ' lsb_DIG.Items.Strings[idx];
end;
Memo4.Lines.Add(msg);
end;
end;
RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
Sei 你好 無法了解你真正的需求,以下提供幾個連結給你參考吧! 【Delphi】【問題】字串排列
http://delphi.ktop.com.tw/topic.php?topic_id=51370
【問題】如何產生配對
http://delphi.ktop.com.tw/topic.php?topic_id=46754
【問題】請教如何將陣列做排列組合
http://delphi.ktop.com.tw/topic.php?topic_id=46217
【Delphi】【問題】請問這個問題該如何解比較好呢? (排列組合的問題)
http://delphi.ktop.com.tw/topic.php?topic_id=45540 _______________________________________
深藍的魚,祝您好運..........連連
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
Sei: 先找到妳原程式裡的 DIG_String := ''; for k := 0 to lsb_DIG_count-1 do begin DIG_String := DIG_String lsb_DIG.Items[k] ' '; end; Memo4.Lines.Add(DIG_String); before_ItemIndex := lsb_DIG.ItemIndex; SpeedButton2.OnClick(Self); after_ItemIndex := lsb_DIG.ItemIndex; 注意紅字部分改成 DIG_String := ''; before_ItemIndex := lsb_DIG.ItemIndex; SpeedButton2.OnClick(Self); for k := 0 to lsb_DIG.count-1 do //lsb_DIG_count改成lsb_DIG.count begin DIG_String := DIG_String lsb_DIG.Items[k] ' '; end; Memo4.Lines.Add(DIG_String); after_ItemIndex := lsb_DIG.ItemIndex; 看看是不是妳要的! 請參考! 如果沒錯表示妳數學還是不錯的,只是放錯位置而已!Andy Chang
------
Andy Chang |
Sei
一般會員 發表:22 回覆:38 積分:17 註冊:2002-05-22 發送簡訊給我 |
感謝各位前輩花時間回覆與解答,也非常抱歉沒有講清楚我需求
是這樣的,我的需求是像
123
132
312
321
231
213
將所有數的排列組合對上,也就是3*2*1,6個結果
之前我寫過的程式在4個數上可以24項完全找到,也符合排列
可是到5的時候,有求過120個、85個,都會重覆出現排列
實在不清楚像這樣的數學式如何找到規則並用程式呈現
richtop前輩就點出來了,謝謝 Chance36前輩裡的連結我在貼文之前就查過了
非常謝謝您的回覆 也非常andychang1690前輩幫我看過程式並為我指導
run出來是120個結果,可是裡面還是有重覆排列
非常謝謝您!!
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |