Entrenamiento especial de la Copa AcWing Blue Bridge: (1) Ejemplos de recursividad y recursividad

Entrenamiento especial de la Copa AcWing Blue Bridge: (1) Ejemplos de recursividad y recursividad

ID de cuenta de AcWing: Koji Tiansuo

Nota: puede ser diferente del código total de y

  1. Implemente recursivamente la enumeración exponencial (maestra),
    seleccione aleatoriamente cualquier número de n enteros de 1 an, y la pregunta finalmente requiere que produzcamos en orden ascendente.
    En la clase general y, se señala claramente que podemos usar el diagrama de árbol a considerar. Para cada dígito, podemos derivar dos casos de selección y no selección. Después de considerar los dos casos, consideraremos los suyos de la misma manera. Seleccione y deseleccione el siguiente dígito ... y así sucesivamente. Siempre que estos dos casos se consideren por separado, preste atención a la reducción recursiva .
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=16;
int n;
vector<int>path;//记录最终答案

void dfs(int u)//u代表了当前是1-n中的哪一个数,由于输出需要从小到大,故从1开始
{
    
    
    if(u == n+1)//如果这n位数都枚举完了,显然是枚举到第n+1个了
    {
    
    
        for(int i=0;i<path.size();i++)
        {
    
    
            cout<<path[i]<<" ";
        }
        cout<<endl;
        return ;//递归终止,开始回溯
    }
 
    path.push_back(u);
    dfs(u+1);//如果选了本位数,就push进去
    path.pop_back();//递归还原
    
    dfs(u+1);//如果没选本位数。
}
int main()
{
    
    
    cin>>n;
    dfs(1);
    return 0;
}
  1. El problema de implementar recursivamente la enumeración exponencial (masterización)
    requiere que interrumpamos el orden de 1-n y, al mismo tiempo, que el orden lexicográfico más pequeño sea lo primero. Entonces usamos for para enumerar cada dígito en nuestro 1-n y marcamos que hemos usado este dígito. Aquí usamos una idea recursiva para resolver:
    Tome el ejemplo de i = 1 bit, tomamos el primer número Después de elegir i = 1 y empujarlo en la matriz de ruta, pasamos de forma recursiva al siguiente nivel eligiendo un número de i = 2-> n.
    De la misma manera, también podemos elegir no i = 1 para el primer nivel de recursividad. A través de para podemos elegir i = 2,3… n como primer número y marcarlo para evitar la repetición, y luego recurrir al siguiente nivel que nunca se ha marcado. El ganador es su próximo dígito. ¡También preste atención a la restauración recursiva !
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=10;
int n;
vector<int>path;
bool st[N];

void dfs(int u)
{
    
    
    if(u == n)
    {
    
    
        for(int i=0;i<path.size();i++)
        {
    
    
            cout<<path[i]<<" ";
        }
        cout<<endl;
        return ;
    }
    for(int i=1;i<=n;i++)
    {
    
    
        if(!st[i])
        {
    
    
            path.push_back(i);
            st[i]=true;
            dfs(u+1);
            st[i]=false;
            path.pop_back();
        }
    }
}
int main()
{
    
    
    cin>>n;
    dfs(0);
    return 0;
}

  1. No hay nada que decir sobre el problema de la secuencia (maestra) de Fibonacci , solo recursividad ordinaria.
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main()
{
    
    
    int n;
    cin>>n;
    if(n==1)
    {
    
    
        cout<<"0"<<endl;
    }
    else
    {
    
    
    a[0]=0;
    a[1]=1;
    cout<<"0"<<" "<<"1"<<" ";
    for(int i=2;i<=n-1;i++)
    {
    
    
        a[i]=a[i-1]+a[i-2];
        cout<<a[i]<<" ";
    }
    cout<<endl;
    }
    return 0;
}
  1. Interruptor inexplicable (intente comprender)
    la idea central de esta pregunta es: en
    primer lugar, en realidad solo es necesario hacer clic en cada cuadrícula. Si presiona un número par, no tendrá ningún efecto. Si presiona un número impar, es equivalente a un número par +1, que es lo mismo que presionar. No cumple con el principio de pasos mínimos.
    Al mismo tiempo, el encendido / apagado de la bombilla equivale a 0/1 en binario, podemos controlar el apagado y encendido de la luz mediante operación de bits.
//首先每个格子都只能按一下,如果按偶数下那么没有效果,如果按技术下,又和1下相同,不符合最小步数原理
#include<bits/stdc++.h>
using namespace std;
const int N=6;
char g[N][N],backup[N][N];
int dx[5]={
    
    -1,0,1,0,0};
int dy[5]={
    
    0,1,0,-1,0};
void turn(int x,int y)
{
    
    
    for(int i=0;i<5;i++)
    {
    
    
        int a=x+dx[i];
        int b=y+dy[i];//二进制48 49 分别为110000,110001,只差1,所以可以亦或
    if(a<0||a>=5||b<0||b>=5)
    {
    
    continue;}
    g[a][b]^=1;
    }//由于字符型0的asicii值为48,1的为49,亦或即便为对位上的相反的数,所以只有最后一位对位相反
}
int main()
{
    
    
    int T;
    cin>>T;
    while(T--)
    {
    
    
        for(int i=0;i<5;i++)
        {
    
    
            cin>>g[i];
        }
        int res=10;//最大步数
        for(int op=0;op<32;op++)//第一行可以变成32种可能性,依据按与不按分为32种情况,设1为可以0为不可以
        {
    
    //例如10001为操作第一位和最后一位
            memcpy(backup,g,sizeof g);
            int step=0;
            for(int i=0;i<5;i++)
            {
    
    
                if(op>>i&1)//二进制位运算,代表着如果op的二进制数中为0则不操作,为1则可操作(选或不选问题)
                {
    
    //所以对5位二进制数的每一位枚举只要有一就改变
                    step++;
                    turn(0,i);//改变原有的亮光程度
                }
            }
            for(int i=0;i<4;i++)//一次枚举剩下的4x5
            {
    
    
                for(int j=0;j<5;j++)
                {
    
    
                    if(g[i][j]=='0')
                    {
    
    
                        step++;
                        turn(i+1,j);//下面决定上面,当上面有0的时候,摁下面
                    }
                }
            }
            bool dark=false;
            for(int i=0;i<5;i++)
            {
    
    
                if(g[4][i]=='0')
                {
    
    
                    dark=true;
                    break;
                }
            }
            if(!dark)
            {
    
    
                res=min(res,step);
            }
            memcpy(g,backup,sizeof g);//还原
        }
        if(res>6)
        {
    
    
            cout<<"-1"<<endl;
        }
        else
        {
    
    
            cout<<res<<endl;
        }
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_44067773/article/details/112856908
Recomendado
Clasificación