蓝桥杯复习 枚举

92. 递归实现指数型枚举

https://www.acwing.com/problem/content/94/

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
int n;
vector<int> ans;
void dfs(int x){
    if(x>n){
        for(int i:ans){
            cout<<i<<" ";
        }
        cout<<endl;
        return ;
    }
    ans.push_back(x);
    dfs(x+1);
    ans.pop_back();
    dfs(x+1);
}
int main(){
    cin>>n;
    dfs(1);
  return 0;
}
//  freopen("testdata.in", "r", stdin);

93. 递归实现组合型枚举

https://www.acwing.com/problem/content/95/

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
int n,m;
int vis[50];
int ans[50];
void dfs(int x,int k){
    if(x>m){
        for(int i=1;i<=m;i++){
            cout<<ans[i]<<" ";
        }
        cout<<endl;
        return ;
    }
    for(int i=k;i<=n;i++){
        if(!vis[i]){
            ans[x]=i;
            vis[i]=1;
            dfs(x+1,i);
            vis[i]=0;
        }
    }
}
int main(){
    cin>>n>>m;
    dfs(1,1);
  return 0;
}
//  freopen("testdata.in", "r", stdin);

94. 递归实现排列型枚举

https://www.acwing.com/problem/content/description/96/

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
int n;
int nums[20];
int vis[20];
void dfs(int x){
    if(x>n){
        for(int i=1;i<=n;i++){
            printf("%d ",nums[i]);
        }
        puts("");
        return ;
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            nums[x]=i;
            vis[i]=1;
            dfs(x+1);
            vis[i]=0;
        }
    }
}
int main(){
    cin>>n;
    dfs(1);
  return 0;
}
//  freopen("testdata.in", "r", stdin);

717. 简单斐波那契

https://www.acwing.com/problem/content/719/

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
long long  ans[60];
int n;
int main(){
    cin>>n;
    ans[1]=1;
    ans[2]=1;
    for(int i=3;i<n;i++){
        ans[i]=ans[i-1]+ans[i-2];
    }
    for(int i=0;i<n;i++){
        printf("%d ",ans[i]);
    }
  return 0;
}
//  freopen("testdata.in", "r", stdin);

95. 费解的开关

https://www.acwing.com/problem/content/97/
思路:假设第一行按法已经确定了,假设第一行此时状态为11011
那么第二行就必须就按第3个位置让第一行的0为1才能达到条件
后面几行就可以根据上一行的状态直接获得答案
所以麻烦就在第一行上,由于没有上一行的条件所以我们采用暴力枚举对第一行的所有操作情况.然后去递推下面的情况
代码:

#include <iostream>
#include <cstring>

using namespace std;

const int INF = 100000;

char g[10][10];
int dx[5] = {0, -1, 0, 1, 0}, dy[5] = {0, 0, 1, 0, -1};

void turn(int x, int y)
{
    for (int i = 0; i < 5; i ++ )
    {
        int a = x + dx[i], b = y + dy[i];
        if (a >= 0 && a < 5 && b >= 0 && b < 5)
        {
            //是1就变成0 是0就变成1
            g[a][b] = '0' + !(g[a][b] - '0');
        }
    }
}

int work()
{
    int ans = INF;
    for (int k = 0; k < 1 << 5; k ++ )
    {
        int res = 0;
        char backup[10][10];
        memcpy(backup, g, sizeof g);

        for (int j = 0; j < 5; j ++ )
        {
            if (k >> j & 1)
            {   //用二进制表达按灯的状态,该位为1就按下去
                res ++ ;
                turn(0, j);
            }
        }
        //在第一行状态确定后就可以递推确定后续的
        for (int i = 0; i < 4; i ++ )
            for (int j = 0; j < 5; j ++ )
                if (g[i][j] == '0')
                {
                    res ++ ;
                    turn(i + 1, j);
                }
        //最后一行是不可能去按的 最后判断最后一行是不是都为1即可
        bool is_successful = true;
        for (int j = 0; j < 5; j ++ )
            if (g[4][j] == '0')
            {
                is_successful = false;
                break;
            }

        if (is_successful) ans = min(ans, res);

        memcpy(g, backup, sizeof g);
    }

    if (ans > 6) return -1;
    return ans;
}

int main()
{
    int T;
    cin >> T;
    while (T -- )
    {
        for (int i = 0; i < 5; i ++ ) cin >> g[i];
        cout << work() << endl;
    }
    return 0;
}

1209. 带分数

https://www.acwing.com/problem/content/submission/1211/

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
int nums[15];
int vis[15];
int n;
int ans=0;
long long fun(int n,int m){
    long long temp=0;
    for(int i=n;i<=m;i++){
        temp*=10;
        temp+=nums[i];
    }
    return temp;
}
void dfs(int x){
    if(x>9){
        for(int i=1;i<=7;i++){//枚举第一个长度
            for(int j=i+1;j<=8;j++){//枚举第二个长度
                long long b=fun(1,i);
                long long c=fun(i+1,j);
                long long d=fun(j+1,9);
                if(n*d==b*d+c) ans++;
            }
        }
        return ;
    }
    for(int i=1;i<=9;i++){
        if(!vis[i]){
            nums[x]=i;
            vis[i]=1;
            dfs(x+1);
            vis[i]=0;
        }
    }
}
int main(){
    cin>>n;
    dfs(1);
    cout<<ans;
  return 0;
}
//  freopen("testdata.in", "r", stdin);

posted @ 2021-04-13 14:21  一个经常掉线的人  阅读(56)  评论(0)    收藏  举报