49 lines
1.5 KiB
C++
49 lines
1.5 KiB
C++
|
|
#include <bits/stdc++.h>
|
|||
|
|
using namespace std;
|
|||
|
|
typedef long long LL;
|
|||
|
|
// 声明一个结构体存储每个数字的木棍数
|
|||
|
|
struct Node {
|
|||
|
|
int num;
|
|||
|
|
int cnt;
|
|||
|
|
} a[6] = {{0, 6}, {1, 2}, {2, 5}, {4, 4}, {7, 3}, {8, 7}};
|
|||
|
|
|
|||
|
|
LL mi = LONG_LONG_MAX;
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
u: 第几个数字
|
|||
|
|
sum: 拼接出的数字
|
|||
|
|
r: 剩余木棍数
|
|||
|
|
*/
|
|||
|
|
void dfs(int u, LL sum, int r) {
|
|||
|
|
// 递归出口
|
|||
|
|
if (r == 0) { // 如果剩余木棍数是0,说明拼接出了一个数字,输出即可
|
|||
|
|
mi = min(mi, sum);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// 遍历每个可能的数字,如果剩余木棍数够用,就选择这个数字
|
|||
|
|
for (int i = 0; i < 6; i++) {
|
|||
|
|
if (a[i].cnt <= r) { // 如果剩余木棍数够用,就选择这个数字
|
|||
|
|
// 如果当前数字是6,并且是前导零,就选择6,否则选择0
|
|||
|
|
int cur = (a[i].num == 0 && u == 1) ? 6 : a[i].num;
|
|||
|
|
// 递归调用,拼接出下一个数字
|
|||
|
|
dfs(u + 1, sum * 10 + cur, r - a[i].cnt);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
int main() {
|
|||
|
|
for (int n = 1; n <= 35; n++) {
|
|||
|
|
// 最小值
|
|||
|
|
mi = LONG_LONG_MAX;
|
|||
|
|
|
|||
|
|
// 开启第一轮次,目前拼接出的数字为0,并且还剩18根木棍
|
|||
|
|
dfs(1, 0, n);
|
|||
|
|
|
|||
|
|
// 如果没有找到答案,输出-1
|
|||
|
|
if (mi == LONG_LONG_MAX)
|
|||
|
|
cout << "n=" << n << ",ans=" << -1 << endl;
|
|||
|
|
else
|
|||
|
|
cout << "n=" << n << ",ans=" << mi << endl;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|