es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Genera la primera permutación lexicográfica (vuelta atrás recursiva).

El código tiene dos problemas:

  1. La función “verify_permutation” devuelve falso si encuentra un número repetido en la permutación generada, pero no comprueba si todos los números del conjunto {1,…,n} están presentes exactamente 3 veces. Por lo tanto, no garantiza que se generen todas las permutaciones posibles.

  2. La función “backtracking” tiene un error lógico en la parte donde se asigna un número a un lugar vacío en la permutación. Después de asignar el número, la función debería llamar a la función “backtracking” recursivamente y luego revertir la asignación y continuar con la siguiente iteración. Sin embargo, el código actual no revierte la asignación antes de continuar, lo que da lugar a permutaciones incorrectas.

Aquí está la traducción del código corregido:

“`cpp
#include <array>
#include <iostream>

using namespace std;

int counters[100] = {3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3};

bool verify_permutation(int V[], int n, int m){
array<int,100> POZ;
POZ.fill(m);
for(int i = 1; i <= 3<em>n; i++){
if(V[i] == 0)
return false;
for(int j = 1; j <= 3</em>n; j++){
if(POZ[V[j]] < m)
return false;
POZ[V[j]] = 0;
for(int k = 1; k <= n; k++){
POZ[k]++;
}
}
}
return true;
}

int j = 1;

void backtracking(int V[], int x, int m, int n){
if(verify_permutation(V, n, m)){
for(int i = 1; i <= 3<em>n; i++)
cout << V[i] << ' ';
return;
}
for(int i = 1; i <= 3</em>n; i++){
if(counters[j] == 0)
continue;
if(V[i] != 0){
counters[V[i]]–;
continue;
}
counters[j]–;
V[i] = j;
backtracking(V, j, m, n);
counters[j]++;
V[i] = 0;
}
return;
}

int main(){
int V[31];
int n, m;
cin >> n >> m;
if(m >= n){
cout << -1;
return 0;
}
for(int i = 1; i <= 3*n; i++){
cin >> V[i];
}
backtracking(V, 1, m, n);
}
“`</int,100>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hay varios problemas con el código:

    1. La función verify_permutation verifica si una permutación es válida o no, pero no se está utilizando de manera efectiva en el algoritmo de retroceso. Se llama después de generar cada posible candidato, lo que significa que el algoritmo generará muchos candidatos inválidos antes de encontrar uno válido, lo que puede hacerlo extremadamente lento para valores grandes de n.
    2. El arreglo counters se utiliza para llevar un registro de cuántas veces se ha utilizado cada elemento, pero no se reinicia correctamente al retroceder. Esto puede llevar a soluciones incorrectas.

    3. La variable j se utiliza para llevar un registro del elemento actual que se va a agregar a la permutación, pero no se reinicia correctamente al retroceder. Esto también puede llevar a soluciones incorrectas.

    Para solucionar estos problemas, la función verify_permutation debería llamarse antes de intentar agregar cualquier nuevo elemento a la permutación, para que solo se generen candidatos válidos. El arreglo counters debería reiniciarse a sus valores originales al retroceder, y la variable j debería reiniciarse a su valor anterior.

Comments are closed.