C/Visual C - Transformación de numeros

 
Vista:

Transformación de numeros

Publicado por Rainman (1 intervención) el 01/09/2002 18:10:23
Hola.

Tengo que entregar una practica y ando bastante perdido. El caso es que me dan dos numeros (ej. 4 y 6) y mediantes 4 funciones (f=2*x, g=x/3 etc) tengo que transformar el numero 4 en el 6. En este ejemplo seria haciendo f(g(4)). Tengo que resolverlo por backtracking escogiendo la solucion que menos funciones utilice, y en caso de utilizar el mismo numero de funciones, elija la que menos funciones diferentes tenga (ej, si se resuelve por fg y por gg, elige gg). Se que no deberia decirlo, pero es algo urgente, si alguien sabe algo por favor me lo haga llegar lo antes posible.

Gracias!

PD: No se si esto va aquí o en otro apartado, pero no he encontrado nada de C++. Disculpen ^_^
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Transformación de números mediante backtracking

Publicado por Alejandro (913 intervenciones) el 19/03/2025 16:31:19
Rainman, para resolver el problema de transformar un número inicial (en este caso, 4) en un número objetivo(6) utilizando un conjunto de funciones y backtracking, puedes seguir estos pasos:

1. Definir las funciones: Primero, define las funciones que vas a utilizar. Por ejemplo:
- `f(x) = 2 * x`
- `g(x) = x / 3`
- `h(x) = x + 1`
- `i(x) = x - 1`

2. Implementar el algoritmo de backtracking: Crea una función recursiva que intente aplicar cada función a tu número actual y verifique si se alcanza el número objetivo. Mantén un registro de las funciones utilizadas y el número de veces que se aplican.

3. Condiciones de parada: Si el número actual es igual al objetivo, guarda la secuencia de funciones utilizada. Si el número de funciones utilizadas es menor que el mínimo encontrado hasta ahora, actualiza la mejor solución. Si el número de funciones es igual, elige la que tenga menos funciones diferentes.

4. Ejemplo de implementación en C++:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
 
using namespace std;
 
int f(int x) { return 2 * x; }
int g(int x) { return x / 3; }
int h(int x) { return x + 1; }
int i(int x) { return x - 1; }
 
void backtrack(int current, int target, vector<int>& path, vector<vector<int>>& results, unordered_map<int, int>& functionCount) {
    if (current == target) {
        results.push_back(path);
        return;
    }
    if (current > target * 2) return; // Limitar el rango para evitar bucles infinitos
 
    // Aplicar cada función
    for (auto& func : functionCount) {
        int next = func.first(current);
        path.push_back(func.second); // Guardar la función utilizada
        backtrack(next, target, path, results, functionCount);
        path.pop_back(); // Deshacer la última acción
    }
}
 
int main() {
    int start = 4;
    int target = 6;
 
    // Mapa de funciones
    unordered_map<int(*)(int), int> functionCount = {
        {f, 1},
        {g, 2},
        {h, 3},
        {i, 4}
    };
 
    vector<vector<int>> results;
    vector<int> path;
 
    backtrack(start, target, path, results, functionCount);
 
    // Procesar resultados para encontrar la mejor solución
    // (Implementar lógica para elegir la mejor solución según los criterios dados)
 
    return 0;
}

Notas:


- Asegúrate de ajustar las funciones y la lógica de backtracking según tus necesidades específicas.
- La implementación de la lógica para elegir la mejor solución debe ser añadida en la sección de procesamiento de resultados.
- Este es un esquema básico y puede requerir ajustes según el contexto de tu práctica.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar