Tarea 2
Samuel López Martínez
Elaborar un programa que permita jugar rompecabezas deslizantes de números con las
siguientes especificaciones:
● Se inicia solicitando al usuario un entero positivo N, para generar un tablero de NxN.
● Generar el tablero inicial resuelto (llenar de arriba a abajo, izquierda a derecha, menor a
mayor, con valores de 1 a ((N*N)-1).
● Revolver automáticamente el tablero utilizando (NxN) movimientos aleatorios válidos.
● Permitir que el usuario juegue realizando movimientos individuales a partir de indicar la
coordenada del elemento a mover.
● Indicar cuando el usuario gane y terminar el juego.
● Ofrecer en todo momento al usuario la opción de resolver el juego automáticamente
mostrando paso por paso.
● Debe utilizar sus propias implementaciones de pilas y colas para resolver el problema.
Consejos:
● Guardar TODOS los movimientos realizados en una pila y resolver utilizando
Backtracking.
● Utilizar pilas para la funcionalidad undo/redo.
● https://en.wikipedia.org/wiki/Sliding_puzzle
● http://mypuzzle.org/sliding
Punto extra
● Un punto extra a aquellos que incluyan la funcionalidad de avanzar y retroceder en el
historial de movimientos (Deshacer / Rehacer).
● Implementar el tablero en un arreglo unidimensional.
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
const int MAX_N = 100;
int tablero[MAX_N * MAX_N];
void inicilizar_tablero (int n){
int temp = n*n;
srand(time(0));
for (int i = 0; i < temp - 1; i++) {
tablero[i] = i + 1;
}
tablero[temp - 1] = 0;
for (int i = temp - 1; i > 0; i--) {
int j = rand() % (i + 1);
swap(tablero[i], tablero[j]);
void mostrar_tablero(int n){
int temp = n*n;
cout << "Tablero:\n";
for (int i = 0; i < temp; i++) {
if (tablero[i] == 0)
cout << " ";
else
cout << (tablero[i] < 10 ? " " : "") << tablero[i] << " ";
if ((i + 1) % n == 0) cout << endl;
}
}
int ubicar_vacio(int n){
int temp = n*n;
for (int i = 0; i <= temp - 1;i++){
if(tablero[i] == 0){
return (i);
}
}
}
void mover_arriba(int n, int v){
int nuevaposicion = v - n;
if (nuevaposicion >= 0){
swap(tablero[v], tablero[nuevaposicion]);
}
void mover_abajo(int n, int v){
int temp = n*n;
int nuevaposicion = v + n;
if (nuevaposicion < temp){
swap(tablero[v], tablero[nuevaposicion]);
}
}
void mover_izquierda(int n, int v){
int nuevaposicion = v - 1;
if (v % n != 0){
swap(tablero[v], tablero[nuevaposicion]);
}
}
void mover_derecha(int n, int v){
int nuevaposicion = v + 1;
if (nuevaposicion % n != 0){
swap(tablero[v], tablero[nuevaposicion]);
}
}
bool tablero_resuelto(int n) {
int total = n * n;
for (int i = 0; i < total - 1; i++) {
if (tablero[i] != i + 1) {
return false;
}
}
return tablero[total - 1] == 0;
}
void jugar(int n){
int f = 1;
inicilizar_tablero (n);
do{
system("cls");
mostrar_tablero(n);
char entrada;
int v = ubicar_vacio(n);
cin >> entrada;
switch(entrada){
case 'w': mover_arriba(n, v); break;
case 's': mover_abajo(n, v); break;
case 'a': mover_izquierda(n, v); break;
case 'd': mover_derecha(n, v); break;
default: break;
}
}while(!tablero_resuelto(n));
cout<<"\nYou Win!!";
}
int main() {
int n = 3;
cout<<"Bienvenido, porfavor ingrese la dimension del puzzle que desea reoslver (n*n): ";
cin>>n;
jugar(n);
}