Esta técnica es una extensión de otros patrones que ya hemos visto, como el Y-Wing, XY-Wing o XYZ-Wing.
Para poder aplicarla tendremos que localizar cuatro casillas con los mismos cuatro candidatos entre ellas, en lugar de tres casillas con los mismos tres candidatos.
No vale cualquier patrón que cumpla esa condición, las casillas deben estar situadas de modo que ocupen dos zonas: una caja y una columna, una caja y una fila o una columna y una fila.
Siguiendo la misma lógica que en los patrones XY-Wing y XYZ-Wing, a las casillas que comparten zona con el resto las llamaremos pivotes, y a las que no, alas.
Existen varios tipos de patrones WXYZ-Wing.
En los primeros tipos de patrón tres de las casillas estarán en la misma fila o columna, y la cuarta compartirá caja con una o dos de las otras casillas.
Para que sea válido, un patrón WXYZ-Wing A debe cumplir varias condiciones:
Entre las cuatro casillas deben tener cuatro candidatos: W, X, Y y Z.
Uno de los candidatos debe estar restringido a una zona y otro a la otra zona. Por ejemplo, en un patrón caja-fila, uno de los cuatro candidatos sólo puede aparecer en la caja y el otro sólo en la fila. En el primer ejemplo de la derecha, el candidato 3 sólo está presente en las casillas de la fila D y el candidato 8 sólo está presente en las casillas de la caja 4.
Siempre partiremos de tres casillas que compartan zona y que entre las tres tengan cuatro candidatos. El tipo concreto de patrón dependerá de la zona que ocupen esas tres casillas y la segunda zona que determine la cuarta casilla. Tenemos algunas variantes, las cuatro primeras parten de tres casillas en la misma fila o columna:
Tipo A: Partiendo de esas tres casillas, la cuarta casilla comparte caja con dos de esas casillas.
Tipo B: La cuarta casilla comparte caja con una de esas casillas, y las otras dos están en la misma caja.
Tipo C: La cuarta casilla comparte caja con una de las casillas, y las otras dos están en cajas diferentes.
Tipo D: La cuarta casilla comparte columna o fila con una de las tres primeras casillas, pero en una caja diferente.
Tipo E: Las tres primeras casillas están en la misma caja, aunque no comparten la misma fila o columna. La cuarta casilla comparte fila o columna con una de ellas.
Tipo F: Es un caso particular del tipo A, en el que las casillas correspondientes a las alas no comparten ningún candidato.
Trataremos cada variante de forma separada.
La casilla o casillas del primer grupo que comparten zona con la cuarta serán nuestros pivotes. La cuarta casilla será el ala 1, y el resto el ala 2.
Tipo A
En este caso tenemos un pivote doble, como en el ejemplo de la derecha. Pero el patrón debe cumplir algunas condiciones adicionales:
Los potenciales pivotes están en la caja k la cuarta casilla tendrá que estar en la misma caja, en la posición p.
La cuarta casilla debe tener sólo dos candidatos que tienen que pertenecer al patrón.
Y uno de esos candidatos debe aparecer en uno o ambos pivotes, pero no en la casilla restante.
El otro candidato debe estar presente en la casilla restante, pero en ninguno de los pivotes.
En nuestro ejemplo, que nuestros candidatos son 1, 3, 4 y 5.
Uno de los valores de ala 1, E7, el 4 aparece en al menos una de las casillas del pivote.
El segundo de los candidatos en el ala 1, el 1, no aparece en los pivotes. Pero sí lo hace en el ala 2.
Con esta configuración tenemos dos posibilidades para la casilla del ala 1:
Que el valor sea 1. Esto elimina 1 como candidato en la caja 6 y en la fila E.
Que el valor sea 4. Como en el resto de casillas el 4 sólo aparece en las casillas pivote, esto deja a las tres casillas de la fila D, D1, D7 y D9, con tres candidatos, 1, 4 y 5. Como el 1 no puede estar en las casillas del pivote, sólo puede estar en la otra casilla, A1. Esto elimina el 1 como candidato en la caja 3 y en la fila D.
En cualquiera de los casos, podemos eliminar el 1 como candidato en las casillas D7, E1, E2 y E3.
Tipo B
En este caso tenemos un pivote sencillo y el ala 2, compuesta con dos casillas en la misma caja. En este caso el patrón debe cumplir algunas condiciones adicionales:
El pivote está en la caja k la cuarta casilla tendrá que estar en la misma caja, en la posición p.
La cuarta casilla debe tener sólo dos candidatos que tienen que pertenecer al patrón.
Y uno de esos candidatos debe aparecer en el pivote, pero no en las casillas restantes.
El otro candidato debe estar presente en las casillas restantes, y opcionalmente en el pivote.
En nuestro ejemplo nuestros candidatos son 1, 5, 6 y 7, en las casillas F6, F7, F8 y E5.
El ala 1 tiene dos de esos candidatos, el 5 y el 7.
Uno de los candidatos, el 7 además, sólo aparece en el pivote.
El otro candidato, el 5, aparece en el ala 2, y en este casi está ausente del pivote.
Con esta configuración tenemos dos posibilidades para la casilla del ala 1:
Que el valor sea 5. Esto elimina 5 como candidato en la caja 6 y en la fila E.
Que el valor sea 7. Esto elimina el 7 como candidato en el pivote, y como es la única casilla donde aparece en esa fila, nos quedan tres casillas con tres candidatos: F6, F7 y F8 con los candidatos 1, 5 y 6. Podemos, por lo tanto, eliminar como candidato el 5 en la fila F. Pero además, el 5 sólo aparece en la caja 6, también podemos eliminarlo de esa caja.
En cualquiera de los casos, podemos eliminar el 5 como candidato en las casillas E7, E8, E9, F4 y F5.
Si el segundo candidato también aparece en el pivote y el patrón aún puede ser útil.
En el segundo ejemplo tenemos las casillas C2, C3, C5 y A5 con los candidatos 2, 3, 6 y 8.
El ala 1. A5, tiene los candidatos 6 y 8.
Uno de los candidatos, el 6 sólo aparece en el pivote.
El otro candidato, el 8, aparece en el ala 2, en la casilla C2, pero también en el pivote, C5.
Ahora, para la casilla A5 tenemos dos alternativas:
Que contenga un 8. Esto elimina como candidato el 8 en la caja 2 y en la fila A.
Que contenga un 6. Esto elimina el 6 como candidato en el pivote, C5, lo que deja tres casillas, C2, C3 y C5 con tres candidatos: 2, 3 y 8. Podemos, por lo tanto, eliminar el 8 como candidato en la fila C. Sin embargo, al contrario que pasaba con el primer ejemplo, el 8 aparece en dos casillas de caja diferentes, C2 en la caja 1 y C5 en la caja 2. Por lo tanto sólo podemos eliminar como candidato el 8 en las casillas de la fila C de la caja 2, en este caso, de C6.
Tipo C
En este caso tenemos un pivote sencillo y el ala 2, compuesta con dos casillas en cajas distintas. En este caso el patrón debe cumplir algunas condiciones adicionales:
El pivote está en la caja k la cuarta casilla tendrá que estar en la misma caja, en la posición p.
La cuarta casilla debe tener sólo dos candidatos que tienen que pertenecer al patrón.
Y uno de esos candidatos debe aparecer en el pivote, pero no en las casillas restantes.
El otro candidato debe estar presente en al menos una de las casillas del ala 2, aunque también puede aparecer en el pivote.
Hay casos óptimos, cuando el segundo candidato aparece sólo en una de las casillas del ala 2 y no en el pivote. En ese caso se puede eliminar también el candidato en la caja que ocupa esa casilla en la fila del ala 1,
En nuestro ejemplo nuestros candidatos son 1, 2, 3 y 8, en las casillas D1, D4 y D7, cada uno en una caja diferente.
La casilla correspondiente al ala 1, F3 contiene los candidatos 1 y 8.
En las tres primeras casillas, el 8 sólo aparece en el pivote, D1, que comparte caja con F3.
El otro candidato, el 1, aparece en D7. También en el pivote, aunque eso no es imprescindible.
Con esta configuración tenemos dos posibilidades para la casilla F3:
Que el valor sea 1. Esto elimina 1 como candidato en el resto de la caja 4.
Que el valor sea 8. Como en el resto de casillas el 8 sólo aparece en el pivote, eso deja esas tres casillas con tres candidatos, y eso nos permite eliminar esos tres candidatos en el resto de la fila D.
En cualquiera de los casos, podemos eliminar el 1 como candidato en las casillas D2 y D3.
Si además, el segundo candidato sólo aparece en una de las casillas del ala 2, y no en el pivote, como en el segundo ejemplo en que el candidato 6 aparece en A9, pero no en A2 ni en A5, podremos eliminar ese candidato en las casillas de la fila B de la caja 3: B7, B8 y B9.
Tipo D
Tenemos el caso formado un una fila y una columna, o una columna y una fila. Si partimos de tres casillas en la misma fila, que contengan cuatro candidatos, en este caso dos de las tres casillas iniciales ocuparán la misma caja, y la cuarta casilla estará en la misma columna que una de esas casillas, pero en otra caja.
Ahora también tenemos un pivote sencillo y el ala 2, compuesta con dos casillas que no estarán en la misma caja:
El pivote está en la caja k la cuarta casilla tendrá que estar en la misma columna y en otra caja, en la fila f2.
La cuarta casilla debe tener sólo dos candidatos que tienen que pertenecer al patrón.
Uno de esos candidatos debe aparecer exclusivamente en el pivote, y no en las casillas restantes.
El otro candidato debe estar presente en la casilla que comparte caja con el pivote, y ausente de la otra casilla del ala 2.
En nuestro ejemplo, que nuestros candidatos son 2, 3, 7 y 8.
Uno de los candidatos del ala 1, E8, aparecerá en el pivote D8, pero no en el resto de casillas, D1 y D7, en este caso el 3.
El segundo de los candidatos en el ala 1, el 2, debe aparecer en la casilla que comparte caja con en el pivote, D7, pero no en la otra casilla del ala 2, D1. No es necesario que aparezca también en el pivote.
Con esta configuración tenemos dos posibilidades para la casilla del ala 1:
Que el valor sea 2. Esto elimina 2 como candidato en la columna 8 de la caja 6.
Que el valor sea 3. Como en el resto de casillas del patrón el 3 sólo aparece en el pivote, en las tres primeras casillas sólo quedan tres candidatos: 2, 7 y 8. Pero además el 2 sólo aparece en la caja 6, por lo tanto podemos eliminar el 2 de la caja 6. Es decir podemos eliminar como candidato el 2 de las casillas E8 y E9 donde aparezca.
Por supuesto, también podemos buscar este tipo de patrón partiendo de columnas en lugar de filas.
Tipo E
El siguiente caso es que partamos de tres casillas con cuatro candidatos que ocupen la misma caja. La cuarta casilla estará en la misma columna o fila que una de esas casillas, pero en otra caja.
Ahora también tenemos un pivote sencillo y el ala 2, compuesta con dos casillas que no estarán en la misma caja:
Las tres casillas no pueden estar en la misma fila o columna.
El pivote está en la caja k la cuarta casilla tendrá que estar en la misma columna y en otra caja, en la fila f2.
La cuarta casilla debe tener sólo dos candidatos que tienen que pertenecer al patrón.
Uno de esos candidatos debe aparecer exclusivamente en el pivote, y no en las casillas restantes.
El otro candidato debe estar presente en una de las casilla que comparte caja con el pivote, y ausente de la otra.
Hay un caso especial para esta última condición:
Supongamos que la cuarta casilla está en la misma columna que el pivote, y además las otras dos casillas de la caja están en la misma columna (como ocurre en el ejemplo). En ese caso el segundo candidato puede aparecer en las dos casillas del ala 2.
El mismo razonamiento sirve su la cuarta casilla comparte fila con el pivote, en ese caso, si las dos casillas del ala 2 comparten fila, ambas pueden contener el segundo candidato.
En nuestro ejemplo, que nuestros candidatos son 1, 2, 8 y 9.
Uno de los candidatos del ala 1, A5, aparecerá en el pivote F5, pero no en el resto de casillas, D6 y E6, en este caso el 8.
El segundo de los candidatos en el ala 1, el 1, debe aparecer en una de las otras casillas que comparte caja con en el pivote, D6 o E6. En este caso, al estar ambas en la misma columna, podría aparecer en los dos. No es necesario que aparezca también en el pivote.
Con esta configuración tenemos dos posibilidades para la casilla del ala 1:
Que el valor sea 1. Esto elimina 1 como candidato en la columna 5 de la caja 2.
Que el valor sea 8. Como en el resto de casillas del patrón el 8 sólo aparece en el pivote, en las tres primeras casillas sólo quedan tres candidatos: 1, 2 y 9. De modo que podemos eliminar el 1 de la columna 6, y de la caja 5.
Eso significa que podemos eliminar el 1 como candidato en las zonas comunes columna 5 de la caja 5 y columna 6 de la caja 2. Es decir, D5, E5, A6, B6 y C6.
Tipo F
Este patrón es un caso particular del patrón tipo A, que tiene un pivote doble y las dos alas tienen una casilla cada una.
Para que sea de tipo F, un patrón tipo A debe cumplir dos condiciones adicionales:
Cada ala tiene dos candidatos.
Las dos alas no tienen ningún candidato en común.
Ahora cada uno de los candidatos del ala 1 cumple la cuarta condición del patrón de tipo A: cada candidato está presente en la otra ala, pero en ninguno de los pivotes.
Por lo tanto portencialmente podemos aplicar la eliminación de candidatos con los cuatro candidatos del patrón en las zonas comunes de las dos alas.
Veamos nuestro ejemplo, formado por las casillas A7, B6, B8 y B9, con los candidatos 1, 2, 4 y 7.
El ala 1, A7 contiene los candidatos 4 y 7, y el ala2 contiene los candidatos 1 y 2. No tienen ningún candidato en común.
Con esta configuración tenemos dos posibilidades para la casilla del ala 1:
Que el valor sea 4. Esto elimina el 4 como candidato en la caja 3.
Que el valor sea 7. Esto elimina el 7 como candidato en el pivote, y por lo tanto de las tres casillas de la fila B. Las casillas B6, B8 y B9 contienen los candidatos 1, 2 y 4, y el 4 sólo aparece en el pivote. Por lo tanto podemos eliminar el 4 de la caja 3.
Si el valor es 4, eso elimina el 4 como candidato en el pivote, y por lo tanto de las casillas de la fila B. Las casillas B6, B8 y B9 contienen los candidatos 1, 2 y 7, y el 7 sólo aparece en el pivote. Por lo que podemos eliminar el 7 de la caja 3.
Si el valor es 7, eso elimina el 7 como candidato en la caja 3.
En cualquier caso podemos eliminar los candidatos 4 y 7 en las casillas de la caja 3 donde aparezca, salvo en las casillas del patrón.
Para el ala 2 también hay dos posibilidades:
Que el valor sea 1. Eso elimina el 1 como candidato en la fila B.
Que el valor sea 2. Eso elimina el 2 como candidato en el pivote. En las casillas de la caja 3, quedan las casillas A7, B8 y B9, con los candidatos 1, 4 y 7, pero el 1 sólo aparece en el pivote, por lo tanto también podemos eliminar el 1 de la fila B.
Que el valor sea 2. Eso elimina el 2 como candidato en la fila B.
Que el valor sea 1. Eso elimina el 1 como candidato en el pivote. En las casillas de la caja 3, quedan las casillas A7, B8 y B9, con los candidatos 2, 4 y 7, pero el 2 sólo aparece en el pivote, por lo tanto también podemos eliminar el 2 de la fila B.
En cualquier caso podemos eliminar los candidatos 1 y 2 en las casillas de la fila B donde aparezca, salvo en las casillas del patrón.
Casillas que "ve" una casilla
Diremos que una casilla C ve a otra C' si ambas casillas pertenecen al mismo grupo, ya sea fila, columna o caja. Es habitual que ciertas reglas se apliquen sólo a ciertas casillas que son vistas o no vistas desde otras casillas determinadas.
En concreto, para patrones WXYZ-Wing tendremos que eliminar candidatos de las casillas vistas por todas las casillas del patrón que tengan como candidato un valor concreto.
Por ejemplo, en el sudoku anterior tendremos que eliminar como candidato el valor 1 en todas las casillas vistas desde D1, D7 y F3, que tengan como candidato el 1, excluyendo esas tres casillas. Esto deja la casilla D2, ya que D1 forma parte del patrón y D3 tiene un valor final asignado.
Las casillas que ve una casilla son siempre tres zonas: una fila, una columna y una caja, que si excluimos a la propia casilla, son veinte casillas en total.
Nuestro objetivo es calcular la intersección de varios conjuntos de casillas. Existen varias formas de hacerlo:
Podríamos crear una clase para trabajar con conjuntos y definir el operador de intersección. Crear un conjunto de casillas vistas para cada una de las casillas que queramos combinar, y aplicar el operador a esos conjuntos. (Existe una clase set en stl, que nos podría servir para esta tarea.)
Una segunda solución sería crear el conjunto de veinte casillas para la primera casilla, y combinar ese conjunto con los de cada una de la siguientes. De este modo sólo tendremos que pasar el conjunto a la función, y crear un nuevo conjunto con las casillas que ve la siguiente casilla que también estén en el conjunto inicial.
Otra opción es trabajar con los conjuntos a partir de los tres parámetros que los definen: fila, columna y caja. Esta solución requiere menos parámetros, pero complica los cálculos.
También podemos recorrer las 81 casillas y verificar para cada una si comparte fila, columna o caja con la casilla objetivo.
Optaremos por la última opción. Para el sudoku del primer ejemplo partiremos del conjunto de casillas que ve D1.
Para la primera casilla tenemos un conjunto vacío, así que añadiremos las 20 casillas.
Para la siguiente casilla combinaremos ese conjunto con las casillas que ve D7, añadiendo a un nuevo conjunto sólo aquellas casillas que también estén en el conjunto de entrada:
De nuevo, combinaremos ese conjunto con las casillas que ve F7, añadiendo a un nuevo conjunto sólo aquellas casillas que también estén en el conjunto de entrada:
Desde un punto de vista de optimización, si queremos que localizar una casilla en el conjunto sea sencillo y rápido será necesario que el conjunto esté ordenado.
Si ordenamos las casillas de izquierda a derecha y de arriba a abajo, tendremos que calcular la fila, columna y caja de cada casilla en función de su número de orden:
Fila: para calcular la fila bastará con calcular el valor de la división entera entre 9.
Columna: para calcular la columna obtendremos el resto de la división entera entre 9.
Caja: calcular la caja es más complicado. Podemos aplicar una fórmula:
k = (nCas/27)*3+((n%27)/3)%3
Pero será más sencillo recurrir a la clase casilla: casilla[f][c].Caja().
Como además sabemos que nuestro conjunto tendrá un máximo de 20 elementos, podemos usar un array estático para almacenarlo.
De modo que añadiremos un array y algunos métodos a la clase Tablero:
class Tablero {
private:
...
int conjunto[20]; // Conjunto de casillas que ven una o varias casillas
int elementosConjunto;
...
void CasillasVe(Casilla* cas);
...
El método CasillasVe actualizará el array Conjunto y el valor de elementosConjunto para que contengan las casillas que son visibles por el parámetro cas. Si asignamos el valor 0 a elementosConjunto se creará un nuevo array con todas las casillas que ve cas.
void Tablero::CasillasVe(Casilla *cas) {
int C[20];
int n=0;
int nCas;
int f, c, k;
for(nCas=0; nCas<81; nCas++) {
f = nCas/9;
c = nCas%9;
k = casilla[f][c].Caja();
if((f == cas->Fila() || c == cas->Columna() || k == cas->Caja()) && cas->Fila()*9+cas->Columna() != nCas) {
if(elementosConjunto==0) C[n++]=nCas;
else {
if(std::bsearch(&nCas, conjunto, elementosConjunto, sizeof(int), &ComparaInt)) C[n++]=nCas;
}
}
}
// Actualizar conjunto:
for(int i=0; i<n; i++) conjunto[i] = C[i];
elementosConjunto=n;
}
Todos los procedimientos para localizar las casillas donde eliminar candidatos se simplifican bastante si podemos calcular el conjunto de casillas en los que potencialmente podemos eliminarlos.
En todos los tipos que hemos visto de patrón WXYZ-Wing, el candidato a eliminar es aquel que esté presente en las dos zonas, para lo que no tendremos en cuenta las casillas que formen parte del pivote, y las casillas afectadas son las visibles por las casillas que tengan ese candidato.
Veamos cada los ejemplos de cada tipo:
Tipo A
El candidato 1 aparece en la fila D y en la caja 6. Será nuestro candidato a eliminar.
Aparece en las casillas D1 y E7. Las casillas visibles para esas dos casillas son D7, D8, D9, E1, E2 y E3. Habría que excluir las que pertenecen al patrón: D7 y D9. Quedan D8, E1, E2 y E3. De ellas sólo D8 y E1 tienen como candidato el 1.
Tipo B
En el primer ejemplo el 5 es el único valor que aparece tanto en la fila F como en la caja 5.
Aparece como candidato en las casillas E5, F7 y F8. Las casillas visibles por esas tres casillas son E7, E8, E9, F4, F5 y F6, y excluyendo las que pertenecen al patrón, F6, quedan E7, E8, E9, F4 y F5. De ellas E8, E9 y F4 tienen como candidato el 5.
Tipo C
En el primer ejemplo el candidato 1 aparece tanto en la fila D como en la caja 4.
Aparece como candidato en las casillas D1, D7 y F3. Las casillas visibles por esas tres casillas son D1, D2 y D3, y excluyendo las que pertenecen al patrón quedan D2 y D3. De ellas sólo D2 contiene el 1 como candidato.
En el segundo ejemplo el candidato 6 aparece en la fila A y en la caja 2.
Aparece como candidato en las casillas A9 y B6. Las casillas visibles por esas dos casillas son A4, A5, A6, B7, B8 y B9. Excluyendo las pertenecientes al patrón A5, y las que no contienen el 6 como candidato quedan A4, B7 y B9.
Tipo D
En este caso, el candidato 2 aparece en la caja 6 y en la columna 8.
Aparece como candidato en las casillas D7, D8 y H8. Las casillas visibles por esas tres casillas son D8, E8 y F8, y excluyendo las que pertenecen al patrón, D8, y las que no contienen el 8 como candidato queda E8.
Tipo E
En este caso, el candidato 1 aparece en la caja 5 y en la columna 5.
Aparece como candidato en las casillas A5 y D6. Las casillas visibles por esas dos casillas son A6, B6, C6, D5, E5 y F6, y excluyendo las que pertenecen al patrón y las que no tienen el 1 como candidato quedan C6 y D5.
Tipo F
Este tipo funciona de un modo diferente, pero podemos seguir aplicando el mismo procedimiento.
Cada uno de los cuatro candidatos sólo aparece en un ala y en la caja o en la fila o columna donde se sitúe esa ala.
En nuestro ejemplo, el candidato 1 aparece en las casillas C6 y B8, las casillas comunes a esas dos casillas son: B1, B2, B3, B4, B5, B6, B7, B8 y B9. Eliminando las casillas que pertenecen al patrón y las que no contienen el 1 como candidato quedan B3 y B5.
El mismo razonamiento se puede aplicar al candidato 2, y nos quedan las mismas casillas: B3 y B5.
Para el candidato 4, tenemos que está presente en las casillas A7 y B8. Las casillas comunes a esas casillas son las correspondientes a la caja 3, y eliminando las casillas que pertenecen al patrón y las que no contienen como candidato el 4 nos quedan A8 y A9.
El mismo razonamiento sirve para el candidato 7, que aparecen en A7 y B9. Ahora nos quedan la casilla A9.
Escribiremos el código para procesar los patrones usando esta técnica, ya que es mucho más general y crea un código más sencillo y claro.
Bibliografía
La página del SudokuWiki contiene una explicación de este método en la sección WXYZ-Wing.
Nombre
Fichero
Fecha
Tamaño
Contador
Descarga
Sudoku 25
sudoku25.zip
2026-06-27
54361 bytes
20
Utilizamos cookies propias solo con finalidad técnica.
Puedes consultar cómo gestionamos las cookies y cómo puedes
controlarlas haciendo clic en Política de cookies y la
Política de Privacidad.
Aceptas las cookies haciendo clic en el botón de aceptación.