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