Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #3  
Antiguo 15-09-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 360
Poder: 3
navbuoy Va por buen camino
le he preguntado a ChatGPT:

Cita:
Para resolver este problema, puedes crear una función que reciba una posición inicial y un número de puntos de movimiento, y que calcule todas las posiciones de las celdas a las que puedes moverte en un tablero de 11 x 12 celdas.

Para simplificar, consideremos que:

La ficha puede moverse en cuatro direcciones: arriba, abajo, izquierda y derecha.
Los movimientos están limitados por el tamaño del tablero y por los puntos de movimiento disponibles.
Una posible estrategia es usar una búsqueda en anchura (BFS, por sus siglas en inglés), que te permitirá explorar todas las celdas alcanzables en función de los puntos de movimiento.

Pasos:
Entrada:

La posición inicial de la ficha (fila, columna).
Los puntos de movimiento disponibles.

Proceso:

Utiliza una cola para ir guardando las posiciones a las que te puedes mover.
Desde cada posición, intenta moverte a las cuatro direcciones posibles.
Resta un punto de movimiento cada vez que te muevas a una nueva celda.
Evita moverte fuera del tablero o visitar la misma celda más de una vez.

Salida:

Un conjunto de posiciones a las que te puedes mover.

Utilizaremos un enfoque basado en BFS (búsqueda en anchura) con una cola y un conjunto para almacenar las celdas visitadas. A continuación te presento un ejemplo de cómo podrías implementarlo.
Código:
#include <vcl.h>
#include <queue>
#include <set>
#include <utility>  // Para std::pair
#include <vector>
#pragma hdrstop
#pragma argsused

// Definir las dimensiones del tablero
const int FILAS = 11;
const int COLUMNAS = 12;

// Función para obtener las posiciones alcanzables
std::set<std::pair<int, int>> movimientos_posibles(std::pair<int, int> inicio, int puntos_movimiento) {
    // Direcciones de movimiento: arriba, abajo, izquierda, derecha
    std::vector<std::pair<int, int>> direcciones = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
    
    // Set para almacenar las posiciones alcanzables
    std::set<std::pair<int, int>> visitadas;
    // Cola para BFS (posición actual y puntos de movimiento restantes)
    std::queue<std::pair<std::pair<int, int>, int>> cola;
    
    // Agregar la posición inicial
    cola.push({inicio, puntos_movimiento});
    visitadas.insert(inicio);
    
    while (!cola.empty()) {
        // Obtener el frente de la cola
        auto actual = cola.front();
        cola.pop();
        int fila_actual = actual.first.first;
        int col_actual = actual.first.second;
        int movimientos_restantes = actual.second;
        
        if (movimientos_restantes > 0) {
            // Explorar las 4 direcciones
            for (auto direccion : direcciones) {
                int nueva_fila = fila_actual + direccion.first;
                int nueva_columna = col_actual + direccion.second;
                
                // Verificar si la nueva posición está dentro del tablero
                if (nueva_fila >= 0 && nueva_fila < FILAS && nueva_columna >= 0 && nueva_columna < COLUMNAS) {
                    std::pair<int, int> nueva_posicion = {nueva_fila, nueva_columna};
                    // Si la posición no ha sido visitada
                    if (visitadas.find(nueva_posicion) == visitadas.end()) {
                        // Agregar la nueva posición
                        visitadas.insert(nueva_posicion);
                        // Agregar la nueva posición a la cola con los movimientos restantes
                        cola.push({nueva_posicion, movimientos_restantes - 1});
                    }
                }
            }
        }
    }
    
    return visitadas;
}

int main() {
    // Posición inicial en la celda (5, 5)
    std::pair<int, int> inicio = {5, 5};
    int puntos_movimiento = 3;  // Número de puntos de movimiento

    // Obtener las celdas alcanzables
    std::set<std::pair<int, int>> celdas_alcanzables = movimientos_posibles(inicio, puntos_movimiento);

    // Imprimir las posiciones alcanzables
    for (auto posicion : celdas_alcanzables) {
        printf("(%d, %d)\n", posicion.first, posicion.second);
    }

    return 0;
}

creo que por ahi ya puedo ir desarrollandolo

me he puesto este disco para animarme con el codigo jaja



https://www.youtube.com/watch?v=0YG2...45yRnZ8mA1RE93

Última edición por navbuoy fecha: 15-09-2024 a las 07:05:21.
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como seleccionar un rango de celdas con Ctrl+clic de un StringGrid wanda Varios 3 28-04-2018 19:56:24
StringGrid problemas al seleccionar celdas danielmj Varios 3 29-10-2014 19:38:58
Cambiar color por defecto al seleccionar varias celdas de un TStringGrid JAI_ME Varios 1 05-08-2012 18:58:19
como seleccionar las celdas de un dbgrid con el mouse jjaen26 OOP 0 13-10-2011 17:48:45
Tablero de Control lucero_chivas C++ Builder 5 23-08-2006 16:59:31


La franja horaria es GMT +2. Ahora son las 18:13:53.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi