// resolver rompecabezas utiliza el algoritmo A *
std :: string Sliding_Solver :: Solve_Puzzle ()
{
- ¿Cómo creo más interés en la programación y soy un buen programador en algoritmos?
- ¿Es realmente necesario que un programador aprenda estructuras de datos y algoritmos?
- ¿Por qué el introsort se convierte de quicksort a heapsort después de cierta profundidad?
- ¿Es cierto que si entendemos los algoritmos podemos entender todos los programas difíciles de todos los idiomas?
- Solicitar respuestas (función Quora): ¿El algoritmo de crédito es proporcional?
// inicia una cola prioritaria para que sea lista abierta, que es la lista que contiene
// los nodos a los que queremos atravesar, estos se ordenan por prioridad mínima, que
// mens el que tenga el menor valor será el padre
std :: priority_queue <Table_Tile, std :: vector , comparador> _open_list;
// inicializa un vector para ser tableros cerrados que contiene todos los nodos que
// visitado
std :: vector _closed_boards;
// comienza colocando nuestro primer tablero dentro de la lista abierta
_open_list.push (_board);
hacer
{
// inicia el primer tablero para mantener un tablero_tile con la menor distancia
Board_Tile _first_board = _open_list.top ();
// emerge de la lista abierta el objeto que tiene la menor distancia
_open_list.pop ();
// empujarlo en los tableros cerrados ya que ahora lo visitamos
_closed_boards.push_back (_first_board.configuration ());
// inicia cuadrados adyacentes para mantener todos los movimientos posibles que podemos hacer
// del primer tablero
std :: vector _adarest_squares = _first_board.move_away (_goal);
// si la distancia de Manhattan es 0, entonces tenemos la solución
if (_first_board.manhattan_distance (Board_Tile (_goal)) == 0)
{
// devuelve los movimientos que tomó para lograr la respuesta
return _first_board.movement_trace ();
}
// mientras todavía tengamos movimientos posibles en casillas adyacentes sigan adelante
while (! _adarest_squares.empty ())
{
// inicie temp para mantener el elemento posterior de los posibles movimientos
Board_Tile _temp = _adarest_squares.back ();
// aparece el último elemento en sqaurse adyacente
_adarest_squares.pop_back ();
// si la temperatura (que es un posible movimiento) existe en un tablero cerrado, entonces
// simplemente continúa, ponlo en una lista abierta para que podamos visitarlo más tarde
if (_find (_closed_boards, _temp.configuration ()))
continuar;
más
_open_list.push (_temp);
}
} while (! _open_list.empty ());
// si llegamos aquí, entonces no hay solución
devolver “SIN SOLUCIÓN”;
}