UVA 00441 - Lotto

UVA 00441 - Lotto

LAVI

解題觀念

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 的集合,然後輸出所有可能組合

Input

每筆測試資料一行
每行的第 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 ){

// 題目要求每 6 個元素做排列組合
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 );

// 當 depth = 6 後 會回來做這個 for 迴圈
// 此時 depth = 5 回到上一次 call dfs 前的深度
// 此時 i = i ,但因此時 for 迴圈走向下一迴 i++ 於是 i = i + 1
// 然後將 input[i] 的值 覆蓋過 ans[5] 接著 call dfs 去輸出 再 return 回來
// 依此類推 當 depth = 5 做完後 會到 depth = 4 ...
}
}

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);
}

// 從深度為 0 開始往下
dfs( 0, 0 );
flag = true;
input.clear();
}
}
On this page
UVA 00441 - Lotto