Solución al problema de las Ocho Reinas, en el que usamos backtracking.
#include <cstdlib> #include <iostream> using namespace std; // Constantes const int MAX = 8; // Cambiar el 8 por N para obtener problemas con N reinas y un tablero de NxN // Tipos typedef int TReinas reinas [MAX]; // Cabeceras de funciones y procedimientos void OchoReinas(TReinas &r, int fila); bool EsSeguro(TReinas r, int fila, int prueba); void PintarTablero(TReinas r); //Programa principal int main () { TReinas reinas; OchoReinas(reinas,0); } // Implementación de funciones y procedimientos void OchoReinas(TReinas &r, int fila) { int prueba; for(prueba = 0; prueba < MAX; prueba++) { if(EsSeguro(r,fila,prueba)) { r[fila] = prueba; if(fila == (MAX-1)) { PintarTablero(r); } else { OchoReinas(r,fila+1); } } } } bool EsSeguro(TReinas r, int fila,int prueba) { int i; for(i = 1; i < MAX; i++) { if((r[fila-i] == prueba) || (r[fila-i] == prueba-i) || (r[fila-i] == prueba+i)) { return false; } } return true; } void PintarTablero(TReinas r) { cout << "---------------------------------" << endl; for(int fila = 0; fila < MAX; fila++) { for(int i = 0; i < r[fila]; i++) { cout << "| "; } cout << "| X "; for (int j = (r[fila] + 1); j < MAX; j++) { cout << "| "; } cout << "|" << endl << "---------------------------------" << endl; } cout << endl; }
Pequeño algoritmo que resuelve el juego de las Torres de Hanoi con N discos. No tiene interfaz gráfica, todo lo hace desde la consola.
package hanoi; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; /** * * @author tauron */ public class Hanoi { public enum palo {izquierdo,central,derecho}; public static void Mover(int n,palo origen, palo auxiliar,palo destino) { if(n == 1) { System.out.println("Mueve el disco " + n + " desde el palo " + origen + " al " + destino); } else { Mover(n-1,origen,destino,auxiliar); System.out.println("Mueve el disco " + n + " desde el palo " + origen + " al " + destino); Mover(n-1,auxiliar,origen,destino); } } public static void main(String[] args) { BufferedReader dataIn = new BufferedReader(new InputStreamReader( System.in)); int numDiscos; String discos = ""; System.out.print("Introduce el número de discos: "); try{ discos = dataIn.readLine(); }catch(IOException e){ System.out.println("¡Error!"); } numDiscos = Integer.valueOf(discos); while (numDiscos < 1) { System.out.println("Vaya chorrada de número has metido. ERROR."); System.out.print("Inserta el número de discos: "); try{ discos = dataIn.readLine(); }catch(IOException e){ System.out.println("¡Error!"); } numDiscos = Integer.valueOf(discos); } // Fin del while Mover(numDiscos,palo.izquierdo,palo.central,palo.derecho); } }
Dada una matriz cuadrada de enteros, el algoritmo devuelve el valor máximo de cada paralela superior a la diagonal principal.
// Incluir E/S y Librerías Standard #include <iostream> #include <cstdlib> using namespace std; // Zona de Declaración de Constantes const int MAX = 100; // Zona de Declaración de Tipos typedef int TArray [MAX][MAX]; typedef struct TMatriz { TArray a; int elem; }; // Zona de Cabeceras de Procedimientos y Funciones void Inicializar(TMatriz &m); void LeerMatriz(TMatriz &m); void EscribirMatriz(TMatriz &m); void Diagonales(TMatriz &m); int ValorMax(TMatriz &m, int tope); // Programa Principal int main() { // Zona de Declaración de Variables del Programa principal TMatriz matriz; cout << endl << "Ejercicio 10.-" << endl << endl; Inicializar(matriz); LeerMatriz(matriz); cout << endl; EscribirMatriz(matriz); Diagonales(matriz); system("Pause"); // Hacer una pausa return 0; // Valor de retorno al S.O. } // Implementación de Procedimientos y Funciones void Inicializar(TMatriz &m) { m.elem = -1; for(int i = 0; i<MAX; i++) { for(int j = 0; j<MAX; j++) { m.a[i][j] = 0; } } } void LeerMatriz(TMatriz &m) { cout << "Indica el numero de filas y columnas que tendra la matriz cuadrada: "; cin >> m.elem; while(m.elem <= 0) { cout << "Escribe un numero mayor que 0: "; cin >> m.elem; } cout << "Introduce valores: " << endl << endl; for (int i = 0; i<m.elem; i++) { for(int j = 0; j<m.elem; j++) { cout << "Fila " << i << " Columna " << j << ": "; cin >> m.a[i][j]; } } } void EscribirMatriz(TMatriz &m) { cout << endl << "Tu matriz es: " << endl; for(int i = 0; i<m.elem; i++) { for(int j = 0; j<m.elem; j++) { cout << m.a[i][j] << " "; } cout << endl; } cout << endl; } void Diagonales(TMatriz &m) { for(int i = 1; i < m.elem; i++) { cout << "Diagonal " << i+1 << ": " << ValorMax(m, i) << endl; } } int ValorMax(TMatriz &m, int tope) { int valor; valor = 0; for(int i = 0; i < (m.elem - (tope - 1)); i++) { if(m.a[i][i+tope] > valor) { valor = m.a[i][i+tope]; } } return valor; }