Cita:
Iniciado por aguml Para empezar no comprendo lo que haces en la estructura que pones el ¿prototipo de la función posición? Se llama igual que la estructura ¿es como un constructor o algo así como con las clases. Además hay dos puntos y más cosas tras ellos que tampoco entiendo.
Código C++:
Ver originalstruct Posicion
{
size_t fila;
size_t columna;
Posicion(size_t fila, size_t columna)
: fila(fila),
columna(columna)
{ }
bool operator==(const Posicion& otra) const
{
return (fila == otra.fila) && (columna == otra.columna);
}
};
En C++, la única diferencia entre
struct y
class es que por defecto (es decir, si no se indica algo explícitamente) el acceso a sus miembros es público en
struct y privado en
class. En todo lo demás son exactamente iguales: aceptan herencia (ya sea de
struct o de
class), polimorfismo,
usan constructores, admiten la sobrecarga de operadores, ...
En el caso que comentas:
Código C++:
Ver originalPosicion(size_t fila, size_t columna)
: fila(fila),
columna(columna)
{ }
Se refiere a un constructor para objetos de tipo
Posicion. Los que ves tras los dos puntos son inicializaciones de variables. Lo anterior es similar (que no necesariamente idéntico) a lo siguiente:
Código C++:
Ver originalPosicion(size_t fila, size_t columna)
{
this->fila = fila;
this->columna = columna;
}
La diferencia principal se encuentra en la cantidad de incializaciones que recibe cada variable. En el primer código se llama al constructor copia de la variable, mientras que en el segundo se llama primero al constructor por defecto y después se hace una asignación. Si trabajas con objetos en vez de con tipos primitivos el segundo ejemplo suele ser más costoso.
Un detalle que puede llamar la atención es que en el primer código no hace falta usar
this y en el segundo sí. Esto se debe a que el compilador en este caso es un pelín inteligente y sabe que estoy inicializando la clase, luego únicamente me va a dejar inicializar miembros de la clase. Para el compilador es como si hubiésemos escrito algo tal que:
Código C++:
Ver originalPosicion(size_t f, size_t c)
: fila(f),
columna(c)
{ }
¿Por qué uso un
struct aquí? por comodidad. No tengo ninguna necesidad de hacer que sus variables internas sean privadas, creando un
struct me ahorro tener que poner
public: Cita:
Iniciado por aguml Otra cosa que me ha llamado la atención es que usas un tipo llamado "auto" ¿ese que tipo es?
Llegados a este punto toca ir revisando las modificaciones que se introdujeron con el estándar C++11. Bien es cierto que el estándar de C++ lleva muuuuchos años parado, pero ahora ha empezado a coger carrerilla. Prueba de ello es que ya tenemos dos estándares nuevos (C++11 y C++14) y otro en camino (C++17).
auto es una palabra reservada que se introdujo en C++11.
auto permite declarar variables, la única cosa es que no eliges tu el tipo de la variable, sino que encargas al compilador la tarea de "deducir" el tipo.
Parece algo chorra pero es muy útil. Imagínate un programita completo y te toca cambiar el tipo que devuelve una función. Usando la forma
tradicional tendrías que buscar todos los usos de la función y cambiar el tipo de la variable en multitud de sitios... con
auto simplemente recompilas y es el compilador el que se encarga de esa tarea.
Cita:
Iniciado por aguml Bueno hay muchas más cosas pero esas me han dejado descolocado.
Pues no te cortes y pregunta, que para eso estamos aquí ;)
Cita:
Iniciado por acknowledge Una forma muy poco eficiente y bruta seria hacer un algoritmo que al azar vaya adelante izquierda o derecha y memorizar los nodos donde estuvo (para no volver al mismo nodo) e ir sumando hasta que llegue de casualidad al final. y ver si es el resultado deseado y si no cumple volver a iterar hasta que la suma sea el numero deseado.
Tu has escrito una respuesta sin leer lo que ya estaba escrito, verdad?
La solución que he puesto sigue exactamente ese ineficiente camino... pero oye, para haber sacado el programa en media hora no está mal del todo, no? :)
Un saludo.