Síguenos en Facebook


Síguenos en Twitter

Compartir este tema:
El 24 marzo, 2011 · 3 Comentarios
  • Compartir en Delicious
  • Compartir en Digg
  • Compartir en Linkedin
  • Compartir en MySpace
  • Compartir en Technorati
  • Compartir en Tuenti

Sudokux es una aplicación en Java, capaz de resolver en menos de un segundo cualquier sudoku que le propongas.

Nombre del Programa: Sudokux.

Versión del Programa: 1.0.

Autor(es): Pablo Martínez Insua (pablomi).

Sistema Operativo: Multiplataforma.

Lenguaje en que fue programado: Java 1.6.x.

Licencia bajo la que fue liberado: Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0. Ver registro en Safe Creative.

Fecha de lanzamiento: 06 – 09 – 2010.

Idioma(s): Español.

Captura:

Código:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
 
// Sudokux 1.0 - Pablo Martínez Insua
//
// Programa registrado.
// Licencia: -http://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){
				System.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].getText().equals(""))
					casilla[fil][col] = Integer.parseInt(numeros[fil][col].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.floor((col-1)/3)*3)+1,
		    cuadroFila = (int)(Math.floor((fil-1)/3)*3)+1;
 
		for(int i=cuadroColumna; i<cuadroColumna +3; i++)
			for (int j=cuadroFila; j<cuadroFila+3; j++)
				if(col!=i && fil!=j && casilla[fil][col] == casilla[j][i])
					return false;
 
		return true;
	}
}

3 Respuestas a “Sudokux”

  1. woky88 dice:

    Hola me parece magnifico este programa pero me interesaría mirar el código fuente completo, porque el que esta colgado en la red no esta completo no se pueden ver las ultimas lineas de código.

    Agradecería que alguien me lo enviara a mi correo: woky88@hotmail.com

    Gracias.

Deja una respuesta

Tu debes estar Loggueado para comentar