蓝桥杯刷题一

1. 递归实现指数型枚举

dfs每层搜索这个数要不要选就好了

#include <bits/stdc++.h>
using namespace std;
int n;
bool st[20];
void dfs(int u)
{
    if(u>n)
    {
        for(int i=1;i<=n;i++)
            if(st[i]) cout<<i<<" ";
        puts("");
        return ;
    }
    dfs(u+1);
    st[u]=true;
    dfs(u+1);
    st[u]=false;
    return ;
}
int main()
{
    cin>>n;
    dfs(1);
    return 0;
}

2. 递归实现排列型枚举

全排列dfs 每一层dfs看一下这个位置要不要选某个数

#include <bits/stdc++.h>
using namespace std;
int n;
bool st[10];
int a[10];
void dfs(int u)
{
    if(u>n)
    {
        for(int i=1;i<=n;i++)
            cout<<a[i]<<" ";
        puts("");
        return ;
    }
    for(int i=1;i<=n;i++)
    {
        if(st[i]) continue;
        a[u]=i;
        st[i]=true;
        dfs(u+1);
        st[i]=false;
    }
    return ;
}
int main()
{
    cin>>n;
    dfs(1);
    return 0;
}

3. 简单斐波那契

非常简单的斐波那契额

#include <bits/stdc++.h>
using namespace std;
int f[55];
int main()
{
    f[0]=0,f[1]=1,f[2]=1;
    for(int i=2;i<=50;i++)
        f[i]=f[i-1]+f[i-2];
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        cout<<f[i]<<" ";
    puts("");
    return 0;
}

4. 递归实现组合型枚举

组合数的枚举方式 树形枚举 根节点到叶子节点的路径都是一个方案

#include <bits/stdc++.h>
using namespace std;
int a[27];
int n,m;
void dfs(int u,int start)
{
    if(u>m)
    {
        for(int i=1;i<=m;i++)
            cout<<a[i]<<" ";
        puts("");
        return ;
    }
    for(int i=start;i<=n;i++)
    {
        a[u]=i;
        dfs(u+1,i+1);
       // a[u]=0;//写不写没关系 会被覆盖
    }
}
int main()
{
    cin>>n>>m;
    dfs(1,1);//第一个参数为层数就是选了 多少个数 第二个参数是当前从那个数开始搜
    return 0;
}

5.翻硬币

 首先能操作第一个硬币的操作只能是 “ 同时操作第一个和第二个硬币 ”的操作 如果目标状态和初始状态的第一个硬币不同我们只能用这个操作 然猴再看第二个硬币如果初始和目标的状态不同 那么只能操作 “ 第二和第三个硬币 ”的操作 因为第一个硬币的状态已经确定了 不可能再去改变第一的状态 那么可以推出来状态是固定的 并且题目说一定有解 直接枚举到n-1个位置就可以出答案了

这题和提高课的一题二进制枚举很像

#include <bits/stdc++.h>

using namespace std;

const int N =110;

int res;
char start[N], aim[N];

void turn(int i)
{
    if (start[i] == 'o')   start[i] = '*';
    else   start[i] = 'o';
}

int main() 
{

    cin >> start >> aim;

    int n = strlen(start);
    for (int i = 0; i < n - 1; i ++)
    {
        if (start[i] != aim[i]) {
            turn(i), turn(i + 1);
            res ++;
        }
    }
    cout<<res<<endl;
    return  0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值