線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1550
推到 Plurk!
推到 Facebook!

如何表列排列組合的結果

答題得分者是:st33chen
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-04-29 13:45:04 IP:59.112.xxx.xxx 訂閱
排列組合中比如說C 5 取 2 (5個位置任取兩個位置的所有可能的排列)
結果是 11000 , 10100 , 10010 , 10001 , 01100 , 01010 , 01001 , 00110 , 00101 , 00011 我想取得這結果的字串
這是我的做法
[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
var s:String;
i,j,iLen:integer;
sl:TStringList;
begin
sl := TStringList.Create;
iLen := 5;
for i := 1 to iLen -1 do
for j := i 1 to iLen do
begin
s := StringOfChar('0',iLen);
s[i] := '1';
s[j] := '1';
sl.Add(s);
end;
ShowMessage(sl.Text);
sl.Free;
end;
[/code]

這樣雖然能完成,但並不理想, 如果要7取3 變成要寫 3個for 迴圈
麻煩有沒有邏輯好的前輩指導一下怎麼做成變動的 m 取 n
------
額有朝天骨,眼中有靈光
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-04-29 15:14:09 IP:122.116.xxx.xxx 未訂閱
您好,

還沒實測, 只是約略的想法,
用 recursive 方式如何

-------------------
學生時期曾用 recursive function 解過西洋棋盤放8個皇后的問題,
感覺和這題有點像.
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2009-04-29 15:36:32, 註解 無‧
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-04-29 15:42:42 IP:59.112.xxx.xxx 訂閱
目前是朝遞迴在寫沒錯,但這兩個變數的遞迴有點複雜
------
額有朝天骨,眼中有靈光
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-04-29 20:08:42 IP:59.112.xxx.xxx 訂閱
的確是用遞迴做出來了, 雖然只有幾行程式, 但卻寫了好幾個小時 > <" , 好久沒這樣傷腦筋了

[code delphi]
function MakeData(m,n: integer):TStringList;
var sl:TStringList;
i:integer;
function mystr(x,y:integer; s:String):string;
begin
if (x = 0) and (y = 0) then
Result := '0'
else if (y = 0) and (x <> 0) then
Result := StringOfChar('0',x)
else if (x = y) and (x <> 0) then
Result := StringOfChar('1',x)
else
begin
if (y > 0) then sl.Add(s '0' mystr(x-1,y,s '0'));
if (y > 0) then sl.Add(s '1' mystr(x-1, y-1 ,s '1'));
end;
end;
begin
sl := TStringList.Create;
mystr(m,n,'');
for i := sl.Count-1 downto 0 do
if Length( sl.Strings[i]) <> m then sl.Delete(i);
Result := sl;
end;
[/code]

老實說,把這種東西拿給別人,有辦法維護才有鬼勒
------
額有朝天骨,眼中有靈光
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-04-30 01:10:36 IP:122.116.xxx.xxx 未訂閱
帥啊 樓主

我的寫法是 :
procedure TForm1.Button1Click(Sender: TObject);
var mylist : tstringlist;
mystr : string;
mm, nn : integer;
function cmp(var astr : string; m, n, p : integer) : string; // 應該用 procedure, 但我比較習慣用 function.
var ii : integer;
begin
if n<=0 then
mylist.Add(astr)
else begin
for ii := p to m do begin
astr := stuffstring(astr, ii, 1, '1');
cmp(astr, m, n-1, ii 1);
end;
end;
astr := stuffstring(astr, p-1, 1, '0');
end;
begin
// mm 取 nn
mm := 6;
nn := 2;
mylist := tstringlist.Create;
mystr := StringOfChar('0', mm);
cmp(mystr, mm, nn, 1);
showmessage(mylist.Text);
mylist.free;
end;

另外, 我還想到二種方法
1. 用 1,2,3,4,5 等數字做排列組合, 例 12, 13, 14, 15, 23, 24, 25, 34, 35, 45
然後用分別改成 11000, 10100, ..., 00011
2. 用 tstringlist 來模擬 stack (就是LIFO 的 QUEUE)
應該也可以達到吧, 有空再來試

參考一下的啦
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2009-04-30 01:17:40, 註解 簡化程式碼‧
st33chen 重新編輯於 2009-04-30 01:18:11, 註解 無‧
st33chen 重新編輯於 2009-04-30 01:24:17, 註解 無‧
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-04-30 07:51:13 IP:59.112.xxx.xxx 訂閱
受教了, 新學一個stuffstring  , 寫了這麼久都沒用這個function 過, 害我
在組字串上面打轉很久, 整個想法都受限制, 多謝st33大
------
額有朝天骨,眼中有靈光
系統時間:2024-05-16 18:01:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!