viernes, 14 de agosto de 2015

Sudoku en java

Código aquí

package ejercicio;

/**
 *
 * @author Sarurai
 */
public class Ejercicio {

    public static final int DIMENSION = 9; // constante

    public void imprimir(int[][] tablero) {
        for (int i = 0; i < DIMENSION; i++) {
            if (i % 3 == 0) {
                System.out.println();
            }
            for (int j = 0; j < DIMENSION; j++) {
                if (j % 3 == 0) {
                    System.out.print(" ");
                }
                System.out.print(tablero[i][j]);
            }
            System.out.println();
        }
    }

    public boolean resolver(int[][] tablero) {
        for (int i = 0; i < DIMENSION; i++) {
            for (int j = 0; j < DIMENSION; j++) {
                if (tablero[i][j] != 0) {
                    continue;
                }
                for (int k = 1; k <= 9; k++) {
                    if (esPosibleInsertar(tablero, i, j, k)) {
                        tablero[i][j] = k;
                        boolean b = resolver(tablero);
                        if (b) {
                            return true;
                        }
                        tablero[i][j] = 0;
                    }
                }
                return false;
            }
        }
        System.out.println("Encontrada solución:");
        imprimir(tablero);
        return true;
    }

    public boolean esPosibleInsertar(int[][] tablero, int i, int j, int valor) {
//Comprueba columna
        for (int a = 0; a < DIMENSION; a++) {
            if (a != i && tablero[a][j] == valor) {
                return false;
            }
        }
//Comprueba fila
        for (int a = 0; a < DIMENSION; a++) {
            if (a != j && tablero[i][a] == valor) {
                return false;
            }
        }
//Comprueba cuadardo
        int y = (i / 3) * 3;
        int x = (j / 3) * 3;
        for (int a = 0; a < DIMENSION / 3; a++) {
            for (int b = 0; b < DIMENSION / 3; b++) {
                if (a != i && b != j && tablero[y + a][x + b] == valor) {
                    return false;
                }
            }
        }
        return true;
    }

    public int[][] generarSudoku() {

        int[][] sudok = new int[9][9];
        for (int i = 0; i < sudok.length; i++) {
            for (int j = 0; j < sudok[1].length; j++) {
                int ale = (int) (Math.random() * 10);
                if (ale == 5) {
                    sudok[i][j] = (int) (Math.random() * 9) + 1;
                } else {
                    sudok[i][j] = 0;
                }
            }

        }
        return sudok;
    }

    public static void main(String[] args) {
        Ejercicio miSudoku = new Ejercicio();

        System.out.println("Sudoku generado");
        int[][] sudoku = miSudoku.generarSudoku();
        miSudoku.imprimir(sudoku);
        System.out.println("Aveces puede demorar por el algoritmo entre 3-15 min");
        if (!miSudoku.resolver(sudoku)) {
            System.out.println("El Sudoku notiene solución");
        }


    }
}

Captura
El método generar sudoku es opcional puedes creas una matriz int de 9*9 y meterle datos.

No hay comentarios:

Publicar un comentario