logo El diario de Pepe Molina (Caricatos)

yo

Para poder resolver sudokus sencillos hemos buscado los números candidatos, discriminando los existentes en el recuadro (grupo de casillas adyacentes mostradas del mismo color), fila y columna de la casilla en cuestión.


Última caricatura

IV Asamblea de la AEC: IV Asamblea General de la Asociación Española de Caricaturistas

IV Asamblea de la AEC

RSS de las imágenes: rss


La Cita

La sabiduría no se traspasa, se aprende

Anónimo, proverbio árabe.


En esta zona están las páginas personales del autor.


Mis clientes ahora también son mis amigos (aunque les cobre).


En Mis amigos Informáticos hay una pequeña colección de páginas de colegas webmasters..


En Mis amigos artistas podemos encontrar artistas de cualquier índole (dibujantes, pintores, escritores...)


Las recomendaciones que proponemos son de índole variada.


Aquí un cajón de sastre de enlaces.


Nos referencian desde sitios de toda índole.


Puede contribuir a mantener esta página con su donativo.


botón pay-pal

Resolver sudokus

emoticón de Caricatos Publicado el día 01 de mayo de 2013
id=120; categorías: Vicisitudes de un Webmaster, Mentes pensantes, Globalización, Programación

Para poder resolver sudokus sencillos hemos buscado los números candidatos, discriminando los existentes en el recuadro (grupo de casillas adyacentes mostradas del mismo color), fila y columna de la casilla en cuestión. Pero en el apunte donde teníamos esa implementación: Resolviendo sencillos sudokus, si necesitábamos modificar alguna casilla, teníamos que encontrar el lugar mediante la cadena de números del campo inicio de un formulario. Hemos resuelto ese inconveniente dándole interactividad a nuestro sudoku, permitiendo modificar su valor pinchando sobre la casilla que quisiéramos modificar. Podemos verlo en este otro apunte: SVG interactivo: sudokus.

Con lo que teníamos tan solo se podían resolver sudokus muy sencillos, así que necesitabamos algo más.

Marcado y recuperación

Al intentar resolver algún sudoku algo más complejos, podemos tener dudas entre algunas posibles soluciones y puede haber algún error al elegirla. Para esos casos nos parece muy útil guardar el estado antes de realizar la elección; en el caso de habernos equivocado, simplemente podemos recuperar ese estado guardado.

Este sistema podemos implementarlo con un par de botones y el siguiente código:

marcas = [];

function poner_marca()	{
	marcas.push(document.forms.form_sudo.inicio.value);
}

function quitar_marca()	{
	if (marcas.length == 0)
		alert("no hay marcas")
	else	{
		sudo = marcas.pop();
		document.forms.form_sudo.inicio.value = sudo;
		entrar_sudoku(sudo);
	}
}

Y "entrar_sudoku()", que utilizaremos más veces:

function entrar_sudoku(cadena) {
	enes = cadena.split("");
	for (var i = 0; i < 9; i++)	for (var j = 0; j < 9; j++)	{
		n = enes.shift();
		poner = ("123456789".indexOf(n) == -1) ? " ": n;
		tag("txt_" + i + "_" + j).replaceChild(document.createTextNode(poner),
			tag("txt_" + i + "_" + j).firstChild);
	}
}

Ahora podemos resolver más fácilmente un sudoku de forma manual, pero aún hay más.

Detectar errores

Si introducimos algún número repetido, podemos creer que estamos resolviendo bien nuestro sudoku, así que aún nos falta implementar si el estado actual de un sudoku es correcto. Para ello tenemos que poder detectar números repetidos en filas, columnas y recuadros (3 filas x 3 columnas).

Para filas y columnas, el código es tan sencillo como comparar cada número encontrado con los anteriormente encontrados, pero para las zonas es algo más complejos. A continuación, la implementación:

function chequear_sudoku()	{
	repes = [];
	sin_errores = true;
	cadena = tag("form_sudo").elements.inicio.value;
	if (cadena.length > 81)
		cadena = cadena.substr(0, 81)
	else
		while (cadena.length < 81)
			cadena += "0";

	for (i = 0; i < 9; i++)
		arr_sudoku[i] = cadena.substr(i * 9, 9);

	// buscamos repes en filas...
	for (i = 0; i < 9; i++)	{
		n = arr_sudoku[i].charAt(0);
		repes[i] = (n == 0) ? []:[n];
		for (j = 1; j < 9; j++)	{
			m = arr_sudoku[i].charAt(j);
			if (in_array(m, repes[i]))
				sin_errores = false;
			else	if (m != 0)
				repes[i].push(m);
		}
	}

	// Ahora buscamos repes en columnas...
	if (sin_errores)
	for (i = 0; i < 9; i++)	{
		n = arr_sudoku[0].charAt(i);
		repes[i] = (n == 0) ? []:[n];
		for (j = 1; j < 9; j++)	{
			m = arr_sudoku[j].charAt(i);
			if (in_array(m, repes[i]))
				sin_errores = false;
			else	if (m != 0)
				repes[i].push(m);
		}
	}

	// Y por último, buscamos repes en zonas...
	if (sin_errores)	{
		for (i = 0; i < 9; i++)	{
			posi = 27 * parseInt(i / 3) + (3 * (i % 3));
			n = cadena.charAt(posi);
			repes[i] = (n == 0) ? []:[n];
		}
		for (j = 1; j < 9; j++)	for (i = 0; i < 9; i++)	{
			posi = (27 * parseInt(i / 3) + (3 * (i % 3))) + (9 * parseInt(j / 3) + (j % 3));
			m = cadena.charAt(posi);
				if (in_array(m, repes[i]))
					sin_errores = false;
				else	if (m != 0)
					repes[i].push(m);
		}
	}
	return sin_errores;
}

Tan solo nos queda mostrar como resolvemos el sudoku, pero al ser un código extenso, enlazaremos con él: script.resolver_sudokus.

Funcionamiento

A continuación el resultado de nuestra implementación.

:
:

:

:
Aquí los progresos (Primeros pasos)
Puede seleccionar una miniatura

Aunque ya resolvemos nuestro pasatiempo favorito, nos queda más que decir en próximos apuntes. Esperamos que haya gustado.

Zona de comentarios

Este apunte aún no tiene comentarios.

Evaluación

Valoración de esta página: (apunte.120) valor

Valoración evaluar evaluar evaluar evaluar evaluar evaluar evaluar evaluar evaluar evaluar

Respuesta: Zona de mensajes (proceso de evaluación)

Historial de navegación

Esta página ha sido visitada en 3994 ocasiones


Disponemos de rss sindicar

Y del Mapa del sitio, además del sitemap.xml.


Aquí podemos encontrar los apuntes más visitados.

"Top 10" reemplaza a la sección Últimos apuntes.


Una buena forma de buscar un apunte es a partir de su categoría.


También es posible buscar apuntes por medio de las etiquetas (tags).


Hemos decidido poner al alcance de todos algunos comodines.

Adjuntamos una versión reducida del "buscador interno" que vemos en la lista anterior:

Buscar en apuntes

También estamos recopilando antiguas páginas del sitio.


Desde este recuadro se puede hacer una búsqueda cronológica.


Se puede crear una postal nueva desde el enlace del sector "Otras páginas del dominio", o editar la que sale en el recuadro, pulsando sobre ella..

http://www.pepemolina.com/clipart/fondos/BCKGRD44.svg
http://www.pepemolina.com/clipart/fondos/1673.svg
http://www.pepemolina.com/postales/aves/ocellot2.gif
enlace a la postal
Copyright © 2002-2018 www.pepemolina.com
RSS rss | Ver Mapa del sitio