如何表列排列組合的結果 |
答題得分者是:st33chen
|
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
排列組合中比如說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 發送簡訊給我 |
您好,
還沒實測, 只是約略的想法, 用 recursive 方式如何 ------------------- 學生時期曾用 recursive function 解過西洋棋盤放8個皇后的問題, 感覺和這題有點像.
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2009-04-29 15:36:32, 註解 無‧
|
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
|
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
的確是用遞迴做出來了, 雖然只有幾行程式, 但卻寫了好幾個小時 > <" , 好久沒這樣傷腦筋了
[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 發送簡訊給我 |
帥啊 樓主 我的寫法是 : 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 (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲. |
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |