解題觀念
DFS
可以參考我的課程簡報:BFS & DFS
關於 DFS 的基本觀念可以參考我的這篇文章:Algorithm - DFS
題目敘述
你在買彩券時一定會挑你喜歡的數字吧!雖然理論上不會增加中獎機率..
我們的問題是:假設共有 49 個號碼,而你必須在你的 k (k > 6)個Lucky Number 中挑 6 個號碼作為一張彩券的數字組合
例如:你的 Lucky Number 集合是 { 1, 2, 3, 5, 8, 13, 21, 34 } 也就是說
k = 8 ,那麼你就有C ( 8, 6 ) = 28 種可能的彩券組合
你的任務是讀入 k 以及 Lucky Number 的集合,然後輸出所有可能組合
每筆測試資料一行
每行的第 1 個整數代表 k(6 < k < 13)
接下來的 k 個整數代表 Lucky Number 的集合,已經按數字由小到大排好,當 k = 0 代表輸入結束
1 2 3 4
| // Sample Input 7 1 2 3 4 5 6 7 8 1 2 3 5 8 13 21 34 0
|
Output
對每一筆測試資料,輸出其所有可能的組合,每個組合一行
請注意輸出組合的順序需由小到大排列
測試資料之間請空一行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| // Sample Output 1 2 3 4 5 6 1 2 3 4 5 7 1 2 3 4 6 7 1 2 3 5 6 7 1 2 4 5 6 7 1 3 4 5 6 7 2 3 4 5 6 7
1 2 3 5 8 13 1 2 3 5 8 21 1 2 3 5 8 34 1 2 3 5 13 21 1 2 3 5 13 34 1 2 3 5 21 34 1 2 3 8 13 21 1 2 3 8 13 34 1 2 3 8 21 34 1 2 3 13 21 34 1 2 5 8 13 21 1 2 5 8 13 34 1 2 5 8 21 34 1 2 5 13 21 34 1 2 8 13 21 34 1 3 5 8 13 21 1 3 5 8 13 34 1 3 5 8 21 34 1 3 5 13 21 34 1 3 8 13 21 34 1 5 8 13 21 34 2 3 5 8 13 21 2 3 5 8 13 34 2 3 5 8 21 34 2 3 5 13 21 34 2 3 8 13 21 34 2 5 8 13 21 34 3 5 8 13 21 34
|
Solution Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include<bits/stdc++.h> using namespace std;
deque<int> input; int k; int ans[6]={0};
void dfs( int depth, int now ){
if( depth == 6 ){ for( int i = 0; i < 6; i++ ){ if( i ){ cout << " "; } cout << ans[i]; } cout << endl; return; }
for( int i = now; i < k; i++ ){
ans[ depth ] = input[ i ]; dfs( depth + 1, i + 1 );
} }
int main(){
bool flag = false; while( cin >> k && k ){
if( flag ){ cout << endl; }
int n; for( int i = 0; i < k; i++ ){ cin >> n; input.push_back(n); }
dfs( 0, 0 ); flag = true; input.clear(); } }
|