蓝桥杯训练 | 递归与递推 | 01

摘要:
目录递归实现指数枚举递归实现排列枚举简单斐波那契令人费解的开关递归实现复合枚举分数导频的兄弟翻转硬币递归实现指数计数#include<iostream>usingspacestd;组成N=15+10;布尔斯特[N];intn;voiddfs{if(u˃n){用于{ifcout<<i<<“”;}cout˂˃n;dfs;return0;}使用namespacestd递归实现置换类型枚举#include;组成N=9+10;嘘声[N];vector<int>路径;intn;intchoice[]={1,2,3,4,5,6,7,8,9};voiddfs{if{for(vector<int>::iterati=path.begin();i!used[i]){used[i]=true,path.push_back;dfs(u+1);used[i]=false,path.pop_back();}}intmain(){cin˃˃n;dfs;return0;}简单斐波那契#include<iostream>usingspacestd;组成N=46+10;intq[N];intmain(){intn;cin˃˃n;q[0]=0,q[1]=1;forq[i]=q[i-1]+q[i-2];forcout˂˂q[i]˂˂“”;cout˂˂endl;return0;}困惑开关的第一行的状态是通过枚举来确定的,然后以下行的状态由第一线的状态来确定,依此类推。核心:在第一行的操作被确定之后,第二行的操作也被唯一地确定。#使用namespacestd包含;组成N=6;charg[N][N],备份[N][N】;intdx[]={0,1,0,-1,0};intdy[]={-1,0,1,0,0};voidturn{对于{inttx=x+dx[i],ty=y+dy[i];ifcontinue;g[tx][ty]=g[tx][ty]=='0'?'1':'0';}}intmain(){intT;cin˃˃T;while(T--){forcin˃˃g[i];interts=1˂˂30;对于{memcpy;intstep=0;对于{if{turn(0,i),step++;}}对于{for{if{turn(i,j),步骤++;}}boolsuccess=真;forif{success=false;break;}ifres=最小值;内存;}ifcout˂˂“-1”˂˂endl;elsecout˂˂res˂˂endl;}return0;}使用namespacestd递归实现复合枚举#include;组成N=30;intn,m;整数[N];vector<int>路径;嘘声[N];voiddfs{ifreturn;if{forcout˂˂path[i]˂˂“”;cout˂˂endl;return;}对于{if(!

目录

递归实现指数型枚举

蓝桥杯训练 | 递归与递推 | 01第1张

蓝桥杯训练 | 递归与递推 | 01第2张

#include<iostream>
using namespace std;

const int N=15+10;
bool st[N];
int n;

void dfs(int u){
    if(u>n){
        for(int i=1;i<=n;i++){
            if(st[i])cout << i << " ";
        }
        cout << endl;
        return;
    }
    st[u]=true,dfs(u+1);
    st[u]=false,dfs(u+1);
}

int main(){
    cin >> n;
    dfs(1);
    
    return 0;
}

递归实现排列型枚举

蓝桥杯训练 | 递归与递推 | 01第3张

蓝桥杯训练 | 递归与递推 | 01第4张

#include<bits/stdc++.h>
using namespace std;

const int N=9+10;
bool used[N];
vector<int> path;
int n;
int choice[] = {1,2,3,4,5,6,7,8,9};

void dfs(int u){
	if(u==n){
		for(vector<int>::iterator i=path.begin();i!=path.end();i++)
			cout << *i << " ";
		cout << endl;
		return ;
	}
	for(int i=0;i<n;i++){
		if(!used[i]){
			used[i]=true,path.push_back(choice[i]);
			dfs(u+1);
			used[i]=false,path.pop_back();		
		}
	}
}

int main(){
	cin >> n;
	dfs(0);
	
	return 0;
}


简单斐波那契

蓝桥杯训练 | 递归与递推 | 01第5张

#include<iostream>
using namespace std;

const int N=46+10;
int q[N];


int main(){
	int n;
	cin >> n;
	q[0]=0,q[1]=1;
	for(int i=2;i<n;i++)q[i]=q[i-1]+q[i-2];
	for(int i=0;i<n;i++)cout << q[i] << " ";
	cout << endl;
	
	return 0;
}

费解的开关

蓝桥杯训练 | 递归与递推 | 01第6张

第一行的状态是通过枚举确定的,然后通过第一行的状态来确定下面行的状态,依次类推.

核心: 第一行的操作确定后,第二行的操作也就唯一确定.

#include<bits/stdc++.h>
using namespace std;

const int N=6;
char g[N][N],backup[N][N];

int dx[]={0,1,0,-1,0};
int dy[]={-1,0,1,0,0};

void turn(int x,int y){
    for(int i=0;i<5;i++){
        int tx=x+dx[i],ty=y+dy[i];
        if(tx<0 || tx>=5 || ty<0 || ty>=5)continue;
        g[tx][ty]=g[tx][ty]=='0'?'1':'0';
    }
}

int main(){
    int T;
    cin >> T;
    while(T--){
        for(int i=0;i<5;i++)cin>>g[i];
        int res=1<<30;
        for(int op=0;op<(1<<5);op++){
            memcpy(backup,g,sizeof g);
            int step=0;
            for(int i=0;i<5;i++){
                if(op >> i & 1){
                    turn(0,i),step++;
                }
            }
            for(int i=1;i<5;i++){
                for(int j=0;j<5;j++){
                    if(g[i-1][j]=='0'){
                        turn(i,j),step++;
                    }
                }
            }
            bool success=true;
            for(int i=0;i<5;i++)
                if(g[4][i]=='0'){
                    success=false;
                    break;
                }
            
            if(success && step<=6)res=min(step,res);    
            memcpy(g,backup,sizeof g);
        }
        if(res==1<<30)cout << "-1" << endl;
        else cout << res << endl;
    }
    return 0;
}

递归实现组合型枚举

蓝桥杯训练 | 递归与递推 | 01第7张

蓝桥杯训练 | 递归与递推 | 01第8张

#include<bits/stdc++.h>
using namespace std;

const int N= 30;
int n,m;
int choice[N];
vector<int> path;
bool used[N];

void dfs(int u,int s){
    if(u+n-s<m)return;
    if(u==m){
        for(int i=0;i<path.size();i++)cout << path[i] << " ";
        cout << endl;
        return;
    }
    for(int i=s;i<n;i++){
        if(!used[i]){
            used[i]=true,path.push_back(choice[i]);
            dfs(u+1,i+1); // 坑
            used[i]=false,path.pop_back();
        }
    }
}

int main(){
    cin >> n >> m;
    for(int i=0;i<=n;i++)choice[i]=i+1;
    dfs(0,0);
    
    return 0;
}

带分数

蓝桥杯训练 | 递归与递推 | 01第9张

#include<bits/stdc++.h>
using namespace std;


int n,res;
int choice[]={1,2,3,4,5,6,7,8,9};
vector<int> path;
bool used[20];

int cal(int l,int r){
    int res=0;
    for(int i=l;i<=r;i++)res=res*10+path[i];
    return res;
}


void dfs(int u){
    if(u==9){
        for(int i=0;i<7;i++){
            for(int j=i+1;j<8;j++){
                int a = cal(0,i);
                int b = cal(i+1,j);
                int c = cal(j+1,8);
                if(c*(n-a)==b)res++;
            }
        }   
        return;
    }
    for(int i=0;i<9;i++){
        if(!used[i]){
            used[i]=true,path.push_back(choice[i]);
            dfs(u+1);
            used[i]=false,path.pop_back();
        }
    }
    
}


int main(){
    cin >> n;
    dfs(0);
    cout << res << endl;
    return 0;
}

飞行员兄弟

蓝桥杯训练 | 递归与递推 | 01第10张

#include<bits/stdc++.h>
using namespace std;

typedef pair<int,int> PII;


const int N=5;
char g[N][N],backup[N][N];

bool check(){
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            if(g[i][j]=='+')return false;
        }
    }
    return true;
}


void turn(int x,int y){
    for(int i=0;i<4;i++){
        g[x][i]=g[x][i]=='+'?'-':'+';
        g[i][y]=g[i][y]=='+'?'-':'+';
    }
    g[x][y]=g[x][y]=='+'?'-':'+';
}

int main(){
    for(int i=0;i<4;i++)cin>>g[i];
    vector<PII> res_f;
    for(int op=0;op< (1<<16);op++){
        vector<PII> res_t;
        memcpy(backup,g,sizeof g);
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                if(op >> (i*4+j) & 1){
                    turn(i,j);
                    res_t.push_back({i,j});
                }
            }
        }
        if(check()){
            if(res_f.empty() || res_f.size() > res_t.size())res_f=res_t;
        }
        
        memcpy(g,backup,sizeof g);
    }
    cout << res_f.size() << endl;
    for(vector<PII>::iterator i=res_f.begin();i!=res_f.end();i++)
        cout <<  i->first + 1 << " " << i->second + 1<< endl;
    
    
    return 0;
}

翻硬币

蓝桥杯训练 | 递归与递推 | 01第11张

#include<bits/stdc++.h>
using namespace std;

const int N=110;
char g[N],dest[N],backup[N];

void turn(int x){
    g[x]=g[x]=='*'?'o':'*';
    g[x-1]=g[x-1]=='*'?'o':'*';
}

int main(){
    cin >> g >> dest;
    int len = strlen(g);
    int res_f=1<<30;
    for(int op=0;op<2;op++){ // 枚举第一个位置按还是不按
        int res_t=0;
        memcpy(backup,g,sizeof g);
        if(op){ // 按
           g[0]=g[0]=='*'?'o':'*';  
           res_t++;
           for(int i=1;i<len;i++){
               if(g[i-1]!=dest[i-1]){
                   res_t++;
                   turn(i);
               }
            }
            if(g[len-1]==dest[len-1] && res_f > res_t)res_f=res_t;    
        }else{
            for(int i=1;i<len;i++){
               if(g[i-1]!=dest[i-1]){
                   res_t++;
                   turn(i);
               }
           }
           if(g[len-1]==dest[len-1] && res_f > res_t)res_f=res_t;   
        }
        memcpy(g,backup,sizeof g);
    }
    cout << res_f << endl;
    
    return 0;
}

免责声明:文章转载自《蓝桥杯训练 | 递归与递推 | 01》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇概要设计文档3.0mybatis-plus总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python基础练习题(题目 递归输出)

day19 --------------------------------------------------------------- 实例027:递归输出 题目 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。 分析:相反顺序可以用列表来,直接pop方法。 1 def reverseprint(a): 2 lit = list(...

wpf treeview 数据绑定 递归绑定节点

1.先上效果 将所有节点加入ComboBox数据源,在ComboBox中选择时下方Treeview显示该节点下的子节点。 1.xaml文件,将以下代码加入界面合适位置 1     <StackPanel> 2 <StackPanel Margin="10"> 3 <La...

Python 创建递归文件夹

# 创建递归文件夹 def createfiles(filepathname): try: os.makedirs(filepathname) except Exception as err: print(str(filepathname) + "已经存在!") filepathname为目录,类型为 "....

python利用递归去遍历多重dict

python中碰到多重dict,如下所示的双层dict,遍历里面的所有元素需要双重循环。现在为了代码美观,希望一句话就可以代替这样的双重for循环。 # 双重dict _dict = { 'A': { 'A1': [1, 2], 'A2': [3, 4] }, 'B': { 'B1':...

文件重命名(递归)

假设需要写入日志文件,但是不希望日志文件太大影响程序性能,这时需要将原文件重命名 //判断文件是否大于10M //取得文件大小 if (File.Exists(logpath)) { FileInfo MyFileInfo = new FileInfo(...

Java实现 蓝桥杯 算法提高 歌唱比赛(暴力)

试题 算法提高 歌唱比赛 问题描述   X市正在进行歌唱比赛,请你写一个程序计算得分。 每名选手从1到N编号,每名选手的综合成绩由以下几个部分组成: 1.歌唱得分占70% 2.才艺展示得分占20% 3.观众投票得分占10% 4.不超过五分的特殊加分(如果总分超过100分则记为100) 输入格式   第一行一个整数N,表示选手人数 接下来N行,每行四个整...