小华非常喜欢吃布丁。这一天她打算购买原味和抹茶味两种布丁,共 n 个,之后按照一定顺序将 n 个布丁全部吃完。
然而如果小华连续吃到三个同口味的布丁,她会感到厌腻而无法继续吃。请你帮助小华规划吃布丁的每一种可行的口味顺序,使她能够全部吃完而不产生厌腻感。
输入数据
输入一个数 n ,表示布丁的数量。
输出数据
每行输出一个由 0 和 1 组成的字符串,表示一种可行的吃布丁的顺序。其中 0 表示原味, 1 表示抹茶味。
请将可行的每种方案按字典序升序输出。
数据范围
对于 100% 的数据, 1≤n≤20 ;
运行时间限制:不超过 1 秒
内存使用限制:不超过 128.0MB
样例
输入
3
输出
001
010
011
100
101
110
解题思路:
简化题意,一个长度为 n 的 01 串,要求没有 3 个及以上连续的 0 或者 1,求所有方案。
每个 0 后面可以加 1 个或者 2 个 1。
每个 1 后面可以加 1 个或者 2 个 0。
我们先考虑第一位为 0 的所有方案,每一个可行的方案都可以归类为上台阶 1 层或 2 层的方案,即上台阶中的每一步,都与前一步相反,前一步为 0 则当前为 1,前一步为 1 则当前为 0。所以以 0 为开头的方案数为斐波那契数列对应的项。
以 1 为开头的方案总数与以 0 为开头的一一对应,即对 0 的方案每一位取反。因此利用类似斐波那契的递归,即可生成所有的方案,因为优先输出字典序更小的,因此优先处理 0 的情况即可。
代码:
#include <bits/stdc++.h>
using namespace std;
int n;
void DFS(int index, string ans) {
if(index == n) {
cout << ans << endl;
return;
}
if(index < 2 || ans[index - 1] != '0' || ans[index - 2] != '0')
DFS(index + 1, ans + "0");
if(index < 2 || ans[index - 1] != '1' || ans[index - 2] != '1')
DFS(index + 1, ans + "1");
}
int main() {
cin >> n;
DFS(0, "");
return 0;
}