51NOD 3413 小华与布丁

小华非常喜欢吃布丁。这一天她打算购买原味和抹茶味两种布丁,共 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;
}

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值