看個例子:
遞迴問題:
usable[3]
表示 3 這個數字可不可以使用bool usable[10] = {0}; // 可以使用的數字
int current_number[10] = {0}; // 目前所選擇的數字
void permutate(int cur_bit, int max_n) {
}
current_number
中的數字一個個輸出if (cur_bit == max_n) {
if (current_number[0] == 0)
return;
for (int i = 0; i < max_n; i++)
cout << current_number[i];
cout << endl;
return;
}
for (int i = 0; i < 10; i++) {
if (usable[i]) {
current_number[cur_bit] = i; // 放入目前所選擇的數字中
usable[i] = false; // 標記為不可使用
permutate(cur_bit + 1, max_n); // 排下一位
usable[i] = true; // 重新標記為可以使用
}
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool usable[10] = {0};
int current_number[10] = {0};
void permutate(int cur_bit, int max_n) {
if (cur_bit == max_n) {
if (current_number[0] == 0)
return;
for (int i = 0; i < max_n; i++)
cout << current_number[i];
cout << endl;
return;
}
for (int i = 0; i < 10; i++) {
if (usable[i]) {
current_number[cur_bit] = i;
usable[i] = false;
permutate(cur_bit + 1, max_n);
usable[i] = true;
}
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int t;
cin >> t;
usable[t] = true; // 標記爲可以使用
}
permutate(0, n); // 排第 0 位,最多排 n 個數字
}
{2, 1, 3}
,呼叫該函數可以把這個 vector 變成 {2, 3, 1}
{3, 2, 1}
),該函數會回傳 false搭配上面提到的兩個函數,我們可以構思出這樣的解法:
sort(a.begin(), a.end());
do {
if (a[0] == 0)
continue;
for (auto t : a)
cout << t;
cout << endl;
} while (next_permutation(a.begin(), a.end()));
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
for (auto &t : a)
cin >> t;
sort(a.begin(), a.end());
do {
if (a[0] == 0)
continue;
for (auto t : a)
cout << t;
cout << endl;
} while (next_permutation(a.begin(), a.end()));
}
根據上面的邏輯,寫出一個函數來轉換牌名與數字:
int getLevel(string &str) {
int level = 0;
if (isdigit(str[0])) {
int d = str[0] - '0';
switch (str[1]) {
case 'T':
d *= 10;
break;
case 'W':
d *= 100;
break;
}
level = d;
} else { // 大字
int d = 1;
switch (str[0]) {
case 'E':
break;
case 'S':
d = 2;
break;
case 'W':
d = 3;
break;
case 'N':
d = 4;
break;
case 'C':
d = 5;
break;
case 'F':
d = 6;
break;
case 'B':
d = 7;
break;
}
level = d * 1000;
}
return level;
}
而在排序時,可以使用 STL 的 sort 函數,為了讓他按照我們的意思排序,我們要自訂一個比較函數,用來比較兩個字串:
bool cmp(string &a, string &b) {
return getLevel(a) < getLevel(b);
}
那在呼叫 sort 函數時,把我們的 cmp 放第三個參數傳進去即可
sort(cards.begin(), cards.end(), cmp);
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int getLevel(string &str) {
int level = 0;
if (isdigit(str[0])) {
int d = str[0] - '0';
switch (str[1]) {
case 'T':
d *= 10;
break;
case 'W':
d *= 100;
break;
}
level = d;
} else {
int d = 1;
switch (str[0]) {
case 'E':
break;
case 'S':
d = 2;
break;
case 'W':
d = 3;
break;
case 'N':
d = 4;
break;
case 'C':
d = 5;
break;
case 'F':
d = 6;
break;
case 'B':
d = 7;
break;
}
level = d*1000;
}
return level;
}
bool cmp(string &a, string &b) {
return getLevel(a) < getLevel(b);
}
int main() {
int n;
cin >> n;
vector<string> cards;
cards.resize(n);
for (int i = 0; i < n; i++) {
cin >> cards[i];
}
sort(cards.begin(), cards.end(), cmp);
for (int i = 0; i < n; i++) {
cout << cards[i];
if (i != n - 1)
cout << ' ';
}
cout << endl;
}