Re: [問題] 關於C語言for寫法
※ 引述《lomokissyou ()》之銘言:
: 輸出:
: 012 013 023 123
: 上述程式的目標是列出所有{0,1,2,3}的3-subset
: 問題是當我輸入turn =2時,如何寫才能動態決定for迴圈的數量
: 也這是說不管我的turn輸入為何 程式都能正確。
: 上述的程式碼在turn=2時就是錯的!應該只需要兩個for迴圈
: 我知道有一種解法是遞迴,不過礙於速度暫不考慮。
: 希望高手可以提示一下方向。感謝!!
你要的 n-subsets 也就是 n-combinations 的非遞迴方法,有很不錯的一種演算法.
我忘了什麼名字,暫且叫它為算珠取法.
例如,對以下二十個數字,用下面類似算盤算珠方式標記它的取出狀態:
12345678901234567890
++++++--------------
一開始取了最前面六個. 之後,第一步是先找到最右邊的一項,該項的右邊包含
其他未選擇項目. 以上例來看,是 6 號這一項. 我們把這一項 + 號一次一次向右移.
( 再說一次這個規則: 找到最右邊的一項,它的右邊包含未選擇項目,或者
包含其他已選擇但不符合本規則的其他項. 此原則的模式很明確,只是
在口語上比較不容易二,三句話講清楚. )
12345678901234567890
+++++-+-------------
12345678901234567890
+++++--+------------
... 幾次之後 ...
12345678901234567890
+++++--------------+
這樣, "12345" 開頭的情況全都找到了. 接著下一步,回憶一下那個取下一選項的
規則: 找到最右的一項,其符合的原則是在右邊存在至少一個空位. 所以下一個找到
的是 5.
12345678901234567890
+++++--------------+
^
這個找法是用一個 while 迴圈,從右端向左找. 篩選條件想一下就明白了.
不過,現在要補充說明,在將選到的 + 號往右移動,每移一步都要做一個後續動作是:
把右邊的完全靠右的 + 號全部拉回來,靠到本項右邊.
回顧一下,當時挑選到 "6",由於它右邊沒有 + 號,所以什麼也沒做.
接下來,選到 "5" 的時候,下一步是二個動作: (1) "5" 的 + 號右移一次, (2)
移動後的 + 號右邊的 + 號全部拉回來. 所以下一步結果:
12345678901234567890
++++-++-------------
所以,總而言之,珠子的右移規則是:
1. 選擇最右邊沒有完全靠右的珠子.
2. 將選到的珠子右移一格.
3. 將右移過的珠子右邊的珠子全都拉回,緊靠著本珠子.
下一步,用同樣的規則挑選,會挑到 "7". 所以下一個結果是這樣:
12345678901234567890
++++-+-+------------
算珠取法,好好享受吧!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.231.69.221
※ 編輯: yauhh 來自: 61.231.69.221 (10/02 23:47)
推
10/02 23:53, , 1F
10/02 23:53, 1F
→
10/02 23:59, , 2F
10/02 23:59, 2F
推
10/03 00:02, , 3F
10/03 00:02, 3F
推
10/03 00:05, , 4F
10/03 00:05, 4F
推
10/03 00:20, , 5F
10/03 00:20, 5F
推
10/03 00:25, , 6F
10/03 00:25, 6F
→
10/03 00:26, , 7F
10/03 00:26, 7F
→
10/03 00:27, , 8F
10/03 00:27, 8F
推
10/03 00:29, , 9F
10/03 00:29, 9F
→
10/03 00:29, , 10F
10/03 00:29, 10F
推
10/03 00:32, , 11F
10/03 00:32, 11F
→
10/03 00:33, , 12F
10/03 00:33, 12F
推
10/03 00:33, , 13F
10/03 00:33, 13F
→
10/03 01:50, , 14F
10/03 01:50, 14F
→
10/03 02:34, , 15F
10/03 02:34, 15F
推
10/03 02:38, , 16F
10/03 02:38, 16F
→
10/03 02:39, , 17F
10/03 02:39, 17F
→
10/03 14:20, , 18F
10/03 14:20, 18F
→
10/03 14:29, , 19F
10/03 14:29, 19F
→
10/03 14:30, , 20F
10/03 14:30, 20F
推
10/04 00:46, , 21F
10/04 00:46, 21F
→
10/04 00:46, , 22F
10/04 00:46, 22F
推
10/04 01:13, , 23F
10/04 01:13, 23F
→
10/04 09:02, , 24F
10/04 09:02, 24F
→
10/04 09:03, , 25F
10/04 09:03, 25F
推
10/04 09:40, , 26F
10/04 09:40, 26F
→
10/04 09:40, , 27F
10/04 09:40, 27F
推
10/04 11:05, , 28F
10/04 11:05, 28F
→
10/04 11:06, , 29F
10/04 11:06, 29F
推
10/04 11:16, , 30F
10/04 11:16, 30F
→
10/04 21:24, , 31F
10/04 21:24, 31F
→
10/04 22:41, , 32F
10/04 22:41, 32F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章