Enumeración recursiva diaria de impulso de Caiji

enumerar

El título viene de acwing

1. Implementar recursivamente enumeración exponencial
Inserte la descripción de la imagen aquí
1. Asegúrese de que las respuestas estén en orden ascendente. Debe asegurarse de que los números de la matriz candidata estén en orden ascendente. El título es un número natural 1-n. No se considera la clasificación, sino una Se requiere inicio para determinar el número que se coloca en la matriz de respuestas cada vez. Cuánto para comenzar.
2. Para generar cada esquema, se deben establecer valores de límite 0-n (n es un conjunto vacío)

#include<bits/stdc++.h>
using namespace std;
int ans[20];
int n;

void dfs(int pos,int start,int cur)//start 确保升序,
{
    
    
    if(pos==cur)
    {
    
    
        for(int i=0; i<cur; i++)
        {
    
    
            i==0||printf(" ");
            printf("%d",ans[i]);
        }
        printf("\n");
    }

    for(int i=start; i<=n; i++) //从1开始进行枚举
    {
    
    
        ans[pos]=i;
        dfs(pos+1, i+1, cur);

    }
}
int main()
{
    
    
    cin>>n;
    for(int i=0; i<=n; i++) //每个方案中数字的数量
        dfs(0,1,i);
}


Variación:
unirse a la matriz

Inserte la descripción de la imagen aquí1. Ordene la matriz candidata;
2. Evite el orden descendente en la respuesta, use inicio para limitar el comienzo de cada ciclo
3. El límite de 0 an representa desde el conjunto vacío hasta el conjunto completo
4. Evite que ingrese el mismo número la respuesta, números repetidos, o Es la primera vez que se elige, o no se repite con el número anterior, el número repetido se filtrará en arry [i]! = arry [i-1]

#include<bits/stdc++.h>
using namespace std;
int ans[20];
int arry[20];
int n;

void dfs(int pos,int start,int cur)//start 确保升序,
{
    
    
    if(pos==cur)
    {
    
    
        for(int i=0; i<cur; i++)
        {
    
    
            i==0||printf(" ");
            printf("%d",ans[i]);
        }
        printf("\n");
    }

    for(int i=start; i<n; i++) //从1开始进行枚举
    {
    
    
        if(i==start||arry[i]>arry[i-1])
        {
    
    
            ans[pos]=arry[i];
            dfs(pos+1, i+1, cur);
        }

    }
}
int main()
{
    
    
    cin>>n;
    for(int i=0; i<n; i++)
        cin>>arry[i];
    sort(arry,arry+n);
    for(int i=0; i<=n; i++) //每个方案中数字的数量
        dfs(0,0,i);
}


2. Implementar recursivamente la enumeración combinada
Inserte la descripción de la imagen aquí 1. Orden ascendente adyacente, comenzar a limitar el siguiente número

#include<bits/stdc++.h>
using namespace std;
int ans[30];
int m,n;

void dfs(int pos,int start)
{
    
    
    if(pos==m)
    {
    
    
        for(int i=0; i<pos; i++)
        {
    
    
            i==0||printf(" ");
            printf("%d",ans[i]);
        }
        printf("\n");
    }
    else
    {
    
    
        for(int i=start; i<=n; i++)
        {
    
    
            ans[pos]=i;
            dfs(pos+1,i+1);
        }
    }
}

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

Variantes
Inserte la descripción de la imagen aquí

#include<bits/stdc++.h>
using namespace std;
int ans[30];
int arry[30];
int n,m;


void dfs(int pos,int start)
{
    
    
    if(pos==m)
    {
    
    
        for(int i=0;i<m;i++)
        {
    
    
            i==0||printf(" ");
            printf("%d",ans[i]);
        }printf("\n");
    }
    else
    {
    
    
        for(int i=start;i<n;i++)
        {
    
    
            if(i==start||arry[i]!=arry[i-1])
            {
    
    
                ans[pos]=arry[i];
                dfs(pos+1,i+1);
            }
        }
    }
}

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

3. Implementar de forma recursiva la enumeración de permutación
Inserte la descripción de la imagen aquí

#include<bits/stdc++.h>
using namespace std;
int ans[10];
int vis[10];
int n;

void dfs(int pos)
{
    
    
    if(pos==n)
    {
    
    
        for(int i=0;i<n;i++)
        {
    
    
            i==0||printf(" ");
            printf("%d",ans[i]);
        }printf("\n");
    }
    else
    {
    
    
        for(int i=1;i<=n;i++)
        {
    
    
            if(!vis[i])
            {
    
    
                vis[i]=1;
                ans[pos]=i;
                dfs(pos+1);
                vis[i]=0;
            }
        }
    }
}

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

Variantes

Inserte la descripción de la imagen aquí1. Cada grupo de datos está en orden arbitrario, no en orden, usando la matriz cnt para contar
2. Use i == 0 || arry [i]! = Arry [i-1] para eliminar duplicados

#include<bits/stdc++.h>
using namespace std;
int ans[10];
int arry[10];
int cnt[10];
int n;

void dfs(int pos)
{
    
    
    if(pos==n)
    {
    
    
        for(int i=0;i<n;i++)
        {
    
    
            i==0||printf(" ");
            printf("%d",ans[i]);
        }printf("\n");
    }
    else
    {
    
    
        for(int i=0;i<n;i++)
        {
    
    
            if(cnt[arry[i]]&&(i==0||arry[i]!=arry[i-1]))
            {
    
    
                cnt[arry[i]]--;
                ans[pos]=arry[i];
                dfs(pos+1);
                cnt[arry[i]]++;
            }
        }
    }
}

int main()
{
    
    
    cin>>n;
    for(int i=0;i<n;i++)
    {
    
    
        cin>>arry[i];
        cnt[arry[i]]++;
    }
    sort(arry,arry+n);
    dfs(0);
}

Resumen

Para la enumeración
1. Se necesita un orden ascendente, comience
2. Si se refiere a la matriz, debe desduplicar y agregar i == (inicial) || arry [i]! = Arry [i-1];
3. Para cada esquema, agregue la función principal For loop, de 0-n como límite de respuesta
4. La disposición desordenada requiere una matriz de conteo de referencias (repeticiones en la matriz) / matriz de acceso (número único en la matriz)
5. El límite de enumeración exponencial no es fijo
6. Tipo combinado Citar el límite fijo
7. La enumeración de permutación se puede atravesar hacia adelante

Supongo que te gusta

Origin blog.csdn.net/aMonstere/article/details/108426970
Recomendado
Clasificación