Programa que Resuelve un Sudoku en Segundos [Source Code – Java]

Sudokux es un programa escrito en java que es capas de resolver cualquier sudoku que tengas por ahí guardado y no allas sido capas de resolver.

Distribuido bajo licencia creative commons.
Y lo bueno de todo es multiplataforma.

sudoku

Dejo el source code el nombre del autor y demas datos estan en el source del programa:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
// Sudokux 1.0 - Pablo Martínez Insua
//
// Programa registrado.
// Licencia: -https://creativecommons.org/licenses/by-nc-sa/3.0/deed.es_PE
public class Sudokux {
  private static int[][] casilla;
  JFrame ventana = new JFrame("Sudokux 1.0");
  JMenuBar menus = new JMenuBar();
  JMenu menuArchivo = new JMenu("Archivo");
  JMenu menuHelp = new JMenu("Ayuda");
  JMenuItem archivoSalir = new JMenuItem("Salir");
  JMenuItem helpAcercaDe = new JMenuItem("Acerca de");
  Font fontRespuesta = new Font("Verdana", Font.BOLD, 20);
  JButton resolver = new JButton("Resolver");
  JButton borrar = new JButton("Borrar");
  JTextField numeros[][] = new JTextField[10][10];
  String solucion;
  public static void main(String[] args){
    casilla = new int[10][10];
    for(int col=0; col<9; col++)
      for(int fil=0; fil<9 ; fil++)
        casilla[fil][col] = 0;
    Sudokux mostrarVentana = new Sudokux();
  }
  public Sudokux(){
    configurar();
    acciones();
  }
  void configurar(){
    menuArchivo.add(archivoSalir);
    menuHelp.add(helpAcercaDe);
    menus.add(menuArchivo);
    menus.add(menuHelp);
    for(int i=1; i<10; i++){
      for(int j=1; j<10; j++){
        numeros[i][j] = new JTextField(1);
        ventana.add(numeros[i][j]);
        numeros[i][j].setFont(fontRespuesta);
      }
    }  
    ventana.add(menus);
    ventana.setJMenuBar(menus);
    ventana.add(resolver);
    ventana.add(borrar);
    ventana.setVisible(true);
    ventana.setSize(300, 420);
    ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ventana.setLayout(new FlowLayout(FlowLayout.CENTER));
  }
  void acciones(){
    archivoSalir.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e){
        {FNAMEL}">System.{FNAMEL}">exit(0);
      }
    });
    helpAcercaDe.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e){
        JOptionPane.showMessageDialog(null, "Programa: Sudokux\nAutor: Pablo Martínez Insua\nVersión: 1.0", "Acerca de", JOptionPane.INFORMATION_MESSAGE);
      }
    });
    resolver.addMouseListener(new MouseAdapter(){
      public void mousePressed(MouseEvent e){
        recoger_datos();
        resuelve(1,1);
        for (int col=1; col<10; col++){
                    for (int fil=1; fil<10 ; fil++){
            numeros[fil][col].setText(""+casilla[fil][col]);
          }
        }
      }
    });
    borrar.addMouseListener(new MouseAdapter(){
      public void mousePressed(MouseEvent e){
        for (int col=1; col<10; col++){
                    for (int fil=1; fil<10 ; fil++){
            numeros[fil][col].setText("");
            casilla[fil][col] = 0;
          }
        }

      }
    });
  }
  void recoger_datos(){
    int tiene = 1;
    for (int col=1; col<10; col++){
                for (int fil=1; fil<10 ; fil++){
        if(!numeros[fil][col].{FNAMEL}">getText().equals(""))
          casilla[fil][col] = Integer.parseInt(numeros[fil][col].{FNAMEL}">getText());
          tiene = 0;
      }
    }
    if(tiene==1){
      JOptionPane.showMessageDialog(null, "Introduce el sudoku a resolver.", "Error", JOptionPane.WARNING_MESSAGE);
    }
  }
  private static boolean resuelve(int fil, int col){
          boolean resuelto = false, casillaSegura = false;
          int num = 1;     

    if (casilla[fil][col]!=0)
          {
                casillaSegura = true;
                num=9;
    }
    while(!resuelto && num<10)
    {
      if(!casillaSegura)
        casilla[fil][col] = num;
      if(es_valida(fil,col))
      {
        if(fil==9 && col==9)
          resuelto = true;
        else if (fil<9)
           resuelto = resuelve(fil+1, col);
        else if(fil==9)
          resuelto = resuelve(1, col+1);
      }
      num++;
    }
    if (!resuelto && !casillaSegura)
      casilla[fil][col] = 0;
    return resuelto;
  }
  private static boolean es_valida(int fil, int col){
    for(int i=1; i<10; i++)
      if(fil!=i && casilla[fil][col] == casilla[i][col])
        return false;
    for (int i=1; i<10; i++)
      if (col!=i && casilla[fil][col] == casilla[fil][i] )
        return false;
    int cuadroColumna = (int)(Math.{FNAMEL}">floor((col-1)/3)*3)+1,
        cuadroFila = (int)(Math.{FNAMEL}">floor((fil-1)/3)*3)+1;
    for(int i=cuadroColumna; i

Espero les sirva de algo aunque sea para revisar el source 😉

Visto en cibernodo.net

Publicado por Maks Skamasle

Sysadmin, fotógrafo aficionado y me gusta tomar el té por las madrugadas cuando no hay ruido ni sol y mas fresco esta el día.

3 respuestas a «Programa que Resuelve un Sudoku en Segundos [Source Code – Java]»

Los comentarios están cerrados.

No usamos Cookies para rastrear nada, navega tranquilo...
Seguir Navegando
x