//using System;
//using System.Collections.Generic;
//using System.ComponentModel;
//using System.Data;
//using System.Drawing;
//using System.Text;
//using System.Windows.Forms;
//using System.Text.RegularExpressions;
////TODO: warning si ninguna celda tiene posibilidades
//namespace Sudoku
//{
// public partial class Form1 : Form
// {
// public const string sSeparadoresDeFila = "+-/";
// public const string sEspaciosEnBlanco = "0_x ";
// string sTablero = "";
// int[,] aTablero = new int[9,9];
// int[,][] aPosibilidades = new int[9, 9][];
// bool lHaySudoku = false;
// bool lPrimeraVez = true;
// bool lTableroPosible = false;
// public Form1()
// {
// InitializeComponent();
// }
// private void button1_Click(object sender, EventArgs e)
// {
// //cargar sudoku
// tbMensajes.Text = "";
// lPrimeraVez = true;
// textBox1.Text = textBox1.Text.PadRight(81, ' ');
// textBox1.Text = ValidarIngreso(textBox1.Text);
// sTablero = textBox1.Text;
// CargarTablero(textBox1.Text);
// PintarSudoku(textBox1.Text);
// lTableroPosible = (ValidarTablero() == 1);
// }
// private int ValidarTablero()
// {
// // Ver si lo que contiene aTablero[,] es consistente hasta donde esté
// // es decir, ningun digito repetido por cada fila, columna y caja
// int nTableroValido = 1;
// for (int i = 1; i <= 9; i++)
// {
// for (int m = 0; nTableroValido == 1 & m < 9; m++)
// {
// // validar cada fila
// int nVeces = 0;
// for (int n = 0; n < 9; n++)
// {
// if (aTablero[m,n] == i) nVeces++;
// }
// if (nVeces > 1) nTableroValido = 0;
// }
// for (int n = 0; nTableroValido == 1 & n < 9; n++)
// {
// // validar cada columna
// int nVeces = 0;
// for (int m = 0; m < 9; m++)
// {
// if (aTablero[m, n] == i) nVeces++;
// }
// if (nVeces > 1) nTableroValido = 0;
// }
// }
// // validar cada caja
// for (int m = 0; nTableroValido == 1 & m < 2; m++)
// {
// for (int n = 0; nTableroValido == 1 & n < 2; n++)
// {
// int x = 1;
// while (nTableroValido == 1 & x <=9)
// {
// int nVeces = 0;
// for (int i = m * 3; i <= m * 3 + 2; i++)
// {
// for (int j = n*3; j <= n * 3 + 2; j++)
// {
// if (aTablero[i, j] == x) nVeces++;
// }
// }
// if (nVeces > 1) nTableroValido = 0;
// x++;
// }
// }
// }
// return nTableroValido;
// }
// private void CargarTablero(string cadena)
// {
// // carga el arreglo aTablero con los resultados
// // inicializa el arreglo aPosibilidades
// int x = 0;
// lHaySudoku = true;
// for (int i = 0; i < 9; i++)
// {
// for (int j = 0; j < 9; j++)
// {
// aTablero[i, j] = Convert.ToInt16(cadena.Substring(x, 1));
// x++;
// if (aTablero[i, j] != 0)
// {
// aPosibilidades[i, j] = new int[] { };
// }
// else
// {
// aPosibilidades[i, j] = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// }
// }
// }
// // limpiar las posibilidades
// for (int i = 0; i < 9; i++)
// {
// for (int j = 0; j < 9; j++)
// {
// if (aTablero[i,j] != 0)
// {
// RecalcularPosibilidades(i, j);
// }
// }
// }
// }
// private void RecalcularPosibilidades( int nfila, int ncolumna)
// {
// int nValor,n;
// nValor = aTablero[nfila, ncolumna];
// // eliminarlas de la fila
// for (int x=0; x < 9; x++)
// {
// if (x != ncolumna)
// {
// // si nValor existe en el arreglo aPosibilidades[nfila, x] entonces eliminarlo
// if (aTablero[nfila, x] == 0)
// {
// n = EncontrarNumeroEnArreglo(aPosibilidades[nfila, x], nValor);
// if ( n >= 0 )
// {
// aPosibilidades[nfila, x] = EliminarPosicionDeArreglo(aPosibilidades[nfila, x],n);
// }
// }
// }
// }
// // eliminarlas de la columna
// for (int x = 0; x < 9; x++)
// {
// if (x != nfila)
// {
// // si nValor existe en el arreglo aPosibilidades[x, ncolumna] entonces eliminarlo
// if (aTablero[x, ncolumna] == 0)
// {
// n = EncontrarNumeroEnArreglo(aPosibilidades[x, ncolumna], nValor);
// if (n >= 0)
// {
// aPosibilidades[x, ncolumna] = EliminarPosicionDeArreglo(aPosibilidades[x, ncolumna], n);
// }
// }
// }
// }
// // eliminarlas de la caja
// int nxcaja, nycaja;
// nxcaja = (nfila - (nfila % 3))/3;
// nycaja = (ncolumna - (ncolumna % 3))/3;
// for (int i = nxcaja*3; i <= nxcaja*3+2; i++)
// {
// for (int j = nycaja*3; j <= nycaja*3+2; j++)
// {
// if (aTablero[i,j] == 0)
// {
// n = EncontrarNumeroEnArreglo(aPosibilidades[i,j], nValor);
// if (n >= 0)
// {
// aPosibilidades[i,j] = EliminarPosicionDeArreglo(aPosibilidades[i,j], n);
// }
// }
// }
// }
// }
// private int[] EliminarPosicionDeArreglo(int[] arr, int n)
// {
// int[] aTemporal = new int[] { } ;
// int nTem = 0;
// if (arr.Length > 1)
// {
// Array.Resize(ref aTemporal, arr.Length-1);
// for (int i = 0; i < n; i++)
// {
// aTemporal[nTem] = arr[i];
// nTem++;
// }
// for (int i = n+1; i < arr.Length ; i++)
// {
// aTemporal[nTem] = arr[i];
// nTem++;
// }
// }
// return aTemporal;
// }
// private int EncontrarNumeroEnArreglo(int[] arr, int n)
// {
// int posicion = -1;
// for (int i = 0; i < arr.Length; i++)
// {
// if ( arr[i] == n )
// posicion = i;
// }
// return posicion;
// }
// private string ValidarIngreso(string cadena)
// {
// //cadena = cadena.PadRight(90, ' ');
// // Anular los separadores de Fila
// for (int i = 0; i< sSeparadoresDeFila.Length; i++)
// {
// cadena = cadena.Replace(sSeparadoresDeFila.Substring(i, 1), "");
// }
// // Reemplazar los espacios en blanco por ceros
// for (int i = 0; i < sEspaciosEnBlanco.Length; i++)
// {
// cadena = cadena.Replace(sEspaciosEnBlanco.Substring(i, 1), "0");
// }
// cadena = Regex.Replace(cadena, @"[^\d]", "");
// return cadena.PadRight(81, '0');
// }
// private void PintarSudoku(string cadena)
// {
// // asegurarse de pintar los ceros como espacios en blanco
// cadena = cadena.Replace("0", " ");
// cadena = cadena.PadRight(81, ' ');
// textBox11.Text = cadena.Substring(0, 1);
// textBox12.Text = cadena.Substring(1, 1);
// textBox13.Text = cadena.Substring(2, 1);
// textBox14.Text = cadena.Substring(3, 1);
// textBox15.Text = cadena.Substring(4, 1);
// textBox16.Text = cadena.Substring(5, 1);
// textBox17.Text = cadena.Substring(6, 1);
// textBox18.Text = cadena.Substring(7, 1);
// textBox19.Text = cadena.Substring(8, 1);
// textBox21.Text = cadena.Substring(9, 1);
// textBox22.Text = cadena.Substring(10, 1);
// textBox23.Text = cadena.Substring(11, 1);
// textBox24.Text = cadena.Substring(12, 1);
// textBox25.Text = cadena.Substring(13, 1);
// textBox26.Text = cadena.Substring(14, 1);
// textBox27.Text = cadena.Substring(15, 1);
// textBox28.Text = cadena.Substring(16, 1);
// textBox29.Text = cadena.Substring(17, 1);
// textBox31.Text = cadena.Substring(18, 1);
// textBox32.Text = cadena.Substring(19, 1);
// textBox33.Text = cadena.Substring(20, 1);
// textBox34.Text = cadena.Substring(21, 1);
// textBox35.Text = cadena.Substring(22, 1);
// textBox36.Text = cadena.Substring(23, 1);
// textBox37.Text = cadena.Substring(24, 1);
// textBox38.Text = cadena.Substring(25, 1);
// textBox39.Text = cadena.Substring(26, 1);
// textBox41.Text = cadena.Substring(27, 1);
// textBox42.Text = cadena.Substring(28, 1);
// textBox43.Text = cadena.Substring(29, 1);
// textBox44.Text = cadena.Substring(30, 1);
// textBox45.Text = cadena.Substring(31, 1);
// textBox46.Text = cadena.Substring(32, 1);
// textBox47.Text = cadena.Substring(33, 1);
// textBox48.Text = cadena.Substring(34, 1);
// textBox49.Text = cadena.Substring(35, 1);
// textBox51.Text = cadena.Substring(36, 1);
// textBox52.Text = cadena.Substring(37, 1);
// textBox53.Text = cadena.Substring(38, 1);
// textBox54.Text = cadena.Substring(39, 1);
// textBox55.Text = cadena.Substring(40, 1);
// textBox56.Text = cadena.Substring(41, 1);
// textBox57.Text = cadena.Substring(42, 1);
// textBox58.Text = cadena.Substring(43, 1);
// textBox59.Text = cadena.Substring(44, 1);
// textBox61.Text = cadena.Substring(45, 1);
// textBox62.Text = cadena.Substring(46, 1);
// textBox63.Text = cadena.Substring(47, 1);
// textBox64.Text = cadena.Substring(48, 1);
// textBox65.Text = cadena.Substring(49, 1);
// textBox66.Text = cadena.Substring(50, 1);
// textBox67.Text = cadena.Substring(51, 1);
// textBox68.Text = cadena.Substring(52, 1);
// textBox69.Text = cadena.Substring(53, 1);
// textBox71.Text = cadena.Substring(54, 1);
// textBox72.Text = cadena.Substring(55, 1);
// textBox73.Text = cadena.Substring(56, 1);
// textBox74.Text = cadena.Substring(57, 1);
// textBox75.Text = cadena.Substring(58, 1);
// textBox76.Text = cadena.Substring(59, 1);
// textBox77.Text = cadena.Substring(60, 1);
// textBox78.Text = cadena.Substring(61, 1);
// textBox79.Text = cadena.Substring(62, 1);
// textBox81.Text = cadena.Substring(63, 1);
// textBox82.Text = cadena.Substring(64, 1);
// textBox83.Text = cadena.Substring(65, 1);
// textBox84.Text = cadena.Substring(66, 1);
// textBox85.Text = cadena.Substring(67, 1);
// textBox86.Text = cadena.Substring(68, 1);
// textBox87.Text = cadena.Substring(69, 1);
// textBox88.Text = cadena.Substring(70, 1);
// textBox89.Text = cadena.Substring(71, 1);
// textBox91.Text = cadena.Substring(72, 1);
// textBox92.Text = cadena.Substring(73, 1);
// textBox93.Text = cadena.Substring(74, 1);
// textBox94.Text = cadena.Substring(75, 1);
// textBox95.Text = cadena.Substring(76, 1);
// textBox96.Text = cadena.Substring(77, 1);
// textBox97.Text = cadena.Substring(78, 1);
// textBox98.Text = cadena.Substring(79, 1);
// textBox99.Text = cadena.Substring(80, 1);
// if (lPrimeraVez)
// {
// lPrimeraVez = false;
// textBox11.Enabled = !(textBox11.Text != " ");
// textBox12.Enabled = !(textBox12.Text != " ");
// textBox13.Enabled = !(textBox13.Text != " ");
// textBox14.Enabled = !(textBox14.Text != " ");
// textBox15.Enabled = !(textBox15.Text != " ");
// textBox16.Enabled = !(textBox16.Text != " ");
// textBox17.Enabled = !(textBox17.Text != " ");
// textBox18.Enabled = !(textBox18.Text != " ");
// textBox19.Enabled = !(textBox19.Text != " ");
// textBox21.Enabled = !(textBox21.Text != " ");
// textBox22.Enabled = !(textBox22.Text != " ");
// textBox23.Enabled = !(textBox23.Text != " ");
// textBox24.Enabled = !(textBox24.Text != " ");
// textBox25.Enabled = !(textBox25.Text != " ");
// textBox26.Enabled = !(textBox26.Text != " ");
// textBox27.Enabled = !(textBox27.Text != " ");
// textBox28.Enabled = !(textBox28.Text != " ");
// textBox29.Enabled = !(textBox29.Text != " ");
// textBox31.Enabled = !(textBox31.Text != " ");
// textBox32.Enabled = !(textBox32.Text != " ");
// textBox33.Enabled = !(textBox33.Text != " ");
// textBox34.Enabled = !(textBox34.Text != " ");
// textBox35.Enabled = !(textBox35.Text != " ");
// textBox36.Enabled = !(textBox36.Text != " ");
// textBox37.Enabled = !(textBox37.Text != " ");
// textBox38.Enabled = !(textBox38.Text != " ");
// textBox39.Enabled = !(textBox39.Text != " ");
// textBox41.Enabled = !(textBox41.Text != " ");
// textBox42.Enabled = !(textBox42.Text != " ");
// textBox43.Enabled = !(textBox43.Text != " ");
// textBox44.Enabled = !(textBox44.Text != " ");
// textBox45.Enabled = !(textBox45.Text != " ");
// textBox46.Enabled = !(textBox46.Text != " ");
// textBox47.Enabled = !(textBox47.Text != " ");
// textBox48.Enabled = !(textBox48.Text != " ");
// textBox49.Enabled = !(textBox49.Text != " ");
// textBox51.Enabled = !(textBox51.Text != " ");
// textBox52.Enabled = !(textBox52.Text != " ");
// textBox53.Enabled = !(textBox53.Text != " ");
// textBox54.Enabled = !(textBox54.Text != " ");
// textBox55.Enabled = !(textBox55.Text != " ");
// textBox56.Enabled = !(textBox56.Text != " ");
// textBox57.Enabled = !(textBox57.Text != " ");
// textBox58.Enabled = !(textBox58.Text != " ");
// textBox59.Enabled = !(textBox59.Text != " ");
// textBox61.Enabled = !(textBox61.Text != " ");
// textBox62.Enabled = !(textBox62.Text != " ");
// textBox63.Enabled = !(textBox63.Text != " ");
// textBox64.Enabled = !(textBox64.Text != " ");
// textBox65.Enabled = !(textBox65.Text != " ");
// textBox66.Enabled = !(textBox66.Text != " ");
// textBox67.Enabled = !(textBox67.Text != " ");
// textBox68.Enabled = !(textBox68.Text != " ");
// textBox69.Enabled = !(textBox69.Text != " ");
// textBox71.Enabled = !(textBox71.Text != " ");
// textBox72.Enabled = !(textBox72.Text != " ");
// textBox73.Enabled = !(textBox73.Text != " ");
// textBox74.Enabled = !(textBox74.Text != " ");
// textBox75.Enabled = !(textBox75.Text != " ");
// textBox76.Enabled = !(textBox76.Text != " ");
// textBox77.Enabled = !(textBox77.Text != " ");
// textBox78.Enabled = !(textBox78.Text != " ");
// textBox79.Enabled = !(textBox79.Text != " ");
// textBox81.Enabled = !(textBox81.Text != " ");
// textBox82.Enabled = !(textBox82.Text != " ");
// textBox83.Enabled = !(textBox83.Text != " ");
// textBox84.Enabled = !(textBox84.Text != " ");
// textBox85.Enabled = !(textBox85.Text != " ");
// textBox86.Enabled = !(textBox86.Text != " ");
// textBox87.Enabled = !(textBox87.Text != " ");
// textBox88.Enabled = !(textBox88.Text != " ");
// textBox89.Enabled = !(textBox89.Text != " ");
// textBox91.Enabled = !(textBox91.Text != " ");
// textBox92.Enabled = !(textBox92.Text != " ");
// textBox93.Enabled = !(textBox93.Text != " ");
// textBox94.Enabled = !(textBox94.Text != " ");
// textBox95.Enabled = !(textBox95.Text != " ");
// textBox96.Enabled = !(textBox96.Text != " ");
// textBox97.Enabled = !(textBox97.Text != " ");
// textBox98.Enabled = !(textBox98.Text != " ");
// textBox99.Enabled = !(textBox99.Text != " ");
// }
// }
// private void Form1_Load(object sender, EventArgs e)
// {
// textBox1.Text = "";
// tbMensajes.Text = "";
// }
// private void button3_Click(object sender, EventArgs e)
// {
// tbMensajes.Text = "Separadores de Fila " + sSeparadoresDeFila + " espacios en blanco " + sEspaciosEnBlanco;
// }
// private void button4_Click(object sender, EventArgs e)
// {
// // Nuevo Sudoku
// /*
// * TODO:
// * Generar un nuevo sudoku segun la dificultad seleccionada
// */
// tbMensajes.Text = "";
// lPrimeraVez = true;
// if (rbMuyFacil.Checked)
// {
// textBox1.Text = "64__139__+1___264__+_29_457__+__2___83_+86__37_19+7__2_9___+__13__69_+9364_8_2_+__5______";
// }
// else if (rbFacil.Checked)
// {
// textBox1.Text = "74_5_____+_2_378__6+_____9_57+4__7_____+9_______3+_____3__2+15_9_____+2__147_9_+_____2_14";
// }
// else if (rbRegular.Checked)
// {
// textBox1.Text = "__9____3_+3____9__2+_52_31_7_+__425____+29_____51+____132__+_8_34_51_+5__1____6+_1____8__";
// }
// else if (rbDificil.Checked)
// {
// textBox1.Text = "___6__1__+___93___4+_____7_29+9_3_6_7__+_4____95_+__8_9_4_2+67_5_9___+2___71___+__4__6___";
// }
// else if (rbMuyDificil.Checked)
// {
// textBox1.Text = "_________+5___8___7+_974_1_2_+_3_____1_+___659___+_2_____4_+_1_2_3___+6___7___8+_________";
// textBox1.Text = "3__87____+_________+_5___9_6_+_________+_4___6_9_+1__32_7__+8_____3__+___154___+71____2__";
// }
// textBox1.Text = ValidarIngreso(textBox1.Text);
// sTablero = textBox1.Text;
// CargarTablero(textBox1.Text);
// PintarSudoku(textBox1.Text);
// lTableroPosible = (ValidarTablero() == 1);
// }
// private void button5_Click(object sender, EventArgs e)
// // Determinar el valor de una casilla
// {
// int nresultado;
// tbMensajes.Text = "";
// if (lHaySudoku & lTableroPosible)
// {
// nresultado = ResolverUnPaso();
// }
// else
// {
// tbMensajes.Text = "No cargó un Sudoku o el Sudoku es contradictorio.";
// }
// }
// private int ResolverUnPaso()
// {
// // Tecnicas implementadas hasta hoy
// // - Naked Single
// // - Hidden Single
// // - Naked Pair
// // - Locked Candidates Claiming
// // - Locked Candidates Pointing
// // - XWing
// // - Hidden Pair
// int i = 0, j = 0, pos=0;
// bool lencontrado = false;
// bool lresuelto = true;
// // Naked singles
// while (!lencontrado & i < 9)
// {
// j = 0;
// while (!lencontrado & j < 9)
// {
// if (aPosibilidades[i, j].Length == 1)
// {
// //encontrado un Hidden Single en fila i, columna j
// lencontrado = true;
// tbMensajes.Text = "hallado con naked single";
// lresuelto = false;
// NumeroEncontrado(i, j, aPosibilidades[i, j][0]);
// }
// else if (aPosibilidades[i, j].Length > 1)
// {
// lresuelto = false;
// }
// j++;
// }
// i++;
// }
// if (lresuelto)
// tbMensajes.Text = "Sudoku resuelto";
// else if (!lencontrado)
// {
// // Hidden single
// // para cada digito
// i = 0;
// while (!lencontrado & i <= 9)
// {
// // buscar en cada fila. si se encuentra anotarlo en lencontrado
// j = 0;
// while (!lencontrado & j < 9)
// {
// int nveces = 0, nypos=0;
// for (int k = 0; k <= 8; k++)
// {
// pos = EncontrarNumeroEnArreglo(aPosibilidades[j, k], i);
// if (pos > -1)
// {
// nveces++;
// nypos = k;
// }
// }
// if ( nveces == 1)
// {
// //tenemos un hidden single en esta fila, posicion [j,nypos]
// lencontrado = true;
// tbMensajes.Text = "hallado con hidden single";
// lresuelto = false;
// NumeroEncontrado(j, nypos, i);
// }
// j++;
// }
// // buscar en cada columna.
// j = 0;
// while (!lencontrado & j < 9)
// {
// int nveces = 0, nxpos = 0;
// for (int k = 0; k <= 8; k++)
// {
// pos = EncontrarNumeroEnArreglo(aPosibilidades[k, j], i);
// if (pos > -1)
// {
// nveces++;
// nxpos = k;
// }
// }
// if (nveces == 1)
// {
// //tenemos un hidden single en esta columna, posicion [nxpos,j]
// lencontrado = true;
// tbMensajes.Text = "hallado con hidden single";
// lresuelto = false;
// NumeroEncontrado(nxpos, j, i);
// }
// j++;
// }
// // buscar en cada caja
// j = 0;
// while (!lencontrado & j <= 2)
// {
// int k = 0;
// while (!lencontrado & k <= 2)
// {
// int nveces = 0, nxpos=0, nypos=0;
// for (int m = j*3; m <= j*3+2; m++)
// {
// for (int n = k*3; n <= k*3+2; n++)
// {
// pos = EncontrarNumeroEnArreglo(aPosibilidades[m, n], i);
// if (pos > -1)
// {
// nveces++;
// nxpos = m;
// nypos = n;
// }
// }
// }
// if (nveces == 1)
// {
// //tenemos un hidden single en esta caja, posicion [nxpos,nypos]
// lencontrado = true;
// tbMensajes.Text = "hallado con hidden single";
// lresuelto = false;
// NumeroEncontrado(nxpos, nypos, i);
// }
// k++;
// }
// j++;
// }
// i++;
// }
// }
// if (lresuelto)
// tbMensajes.Text = "Sudoku resuelto";
// else if (!lencontrado)
// {
// // Naked pair
// i = 0;
// while ( !lencontrado & i < 9)
// {
// j = 0;
// while ( !lencontrado & j < 9)
// {
// if (aPosibilidades[i, j].Length == 2)
// {
// // esta celda tiene solo dos posibilidades
// // buscar otra hacia la derecha o hacia abajo para la fila, columna o caja
// int m = i ;
// while (!lencontrado & m < 9)
// {
// int n = j ;
// while (!lencontrado & n < 9)
// {
// if (m != i | n != j)
// {
// if (aPosibilidades[m, n].Length == 2)
// {
// // ver si corresponden a la misma fila, columna o caja
// if (i == m | j == n | CompartenCaja(i, j, m, n) == 1)
// {
// // ver si son el mismo par
// bool liguales = true;
// for (int k = 0; k < 2; k++)
// {
// if (aPosibilidades[i, j][k] != aPosibilidades[m, n][k])
// {
// liguales = false;
// }
// }
// if (liguales)
// {
// // tenemos un naked pair entre [i,j] y [m,n]
// // eliminar candidatos
// if (i == m)
// {
// // eliminar candidatos en el resto de la fila
// for (int w = 0; w < 9; w++)
// {
// if (w != j & w != n & aTablero[i,w]==0)
// {
// for (int v = 0; v < 2; v++)
// {
// pos = EncontrarNumeroEnArreglo(aPosibilidades[i, w], aPosibilidades[i, j][v]);
// if (pos > -1)
// {
// aPosibilidades[i, w] = EliminarPosicionDeArreglo(aPosibilidades[i, w], pos);
// lencontrado = true;
// }
// }
// }
// }
// }
// if (j == n)
// {
// // eliminar candidatos en el resto de la columna
// for (int w = 0; w < 9; w++)
// {
// if (w != i & w != m & aTablero[w,j]==0)
// {
// for (int v = 0; v < 2; v++)
// {
// pos = EncontrarNumeroEnArreglo(aPosibilidades[w, j], aPosibilidades[i, j][v]);
// if (pos > -1)
// {
// aPosibilidades[w, j] = EliminarPosicionDeArreglo(aPosibilidades[w, j], pos);
// lencontrado = true;
// }
// }
// }
// }
// }
// if (CompartenCaja(i,j,m,n)==1)
// {
// int nxcoord = (i-(i%3))/3;
// int nycoord = (j - (j % 3)) / 3;
// for (int w = nxcoord*3; w <= nxcoord*3+2; w++)
// {
// for (int v = nycoord*3; v <= nycoord*3+ 2; v++)
// {
// if (!(w == i & v == j))
// {
// if(!(w == m & v == n))
// {
// if (aTablero[w,v] == 0)
// {
// for (int h = 0; h < 2; h++)
// {
// pos = EncontrarNumeroEnArreglo(aPosibilidades[w, v], aPosibilidades[i, j][h]);
// if (pos > -1)
// {
// aPosibilidades[w, v] = EliminarPosicionDeArreglo(aPosibilidades[w, v], pos);
// lencontrado = true;
// }
// }
// }
// }
// }
// }
// }
// }
// if (lencontrado)
// tbMensajes.Text = "Se halló Naked Pair en [" + string.Concat(i, ",", j, "] y [", m, ",", n, "]. Valores posibles:", aPosibilidades[i, j][0], " y ", aPosibilidades[i, j][1]);
// /*if (lencontrado)
// tbMensajes.Text = string.Concat(tbMensajes.Text, " - candidatos eliminados satisfactoriamente.");
// else
// tbMensajes.Text = string.Concat(tbMensajes.Text, " - no hay candidatos por eliminar.");
// */
// }
// }
// }
// }
// n++;
// }
// m++;
// }
// }
// j++;
// }
// i++;
// }
// }
// if (lresuelto)
// tbMensajes.Text = "Sudoku resuelto";
// else if (!lencontrado)
// {
// // Locked candidates: Claiming
// i = 1;
// while (!lencontrado & i <= 9)
// {
// // para cada digito, revisar cada fila
// j = 0;
// while (!lencontrado & j < 9)
// {
// bool lseguir = true;
// int k = 0;
// // barrer toda la columna
// while (lseguir & k < 9)
// {
// if (aTablero[j, k] == 0)
// {
// pos = EncontrarNumeroEnArreglo(aPosibilidades[j, k], i);
// if (pos > -1)
// {
// bool lenmismacaja = true;
// int m = k + 1, pos2, pos3;
// while (lenmismacaja & m < 9)
// {
// pos2 = EncontrarNumeroEnArreglo(aPosibilidades[j, m], i);
// if (pos2 > -1)
// {
// // si [j,k] y [j,m] estan en diferente caja. sonamos
// if (k-(k%3) != m-(m%3))
// {
// lenmismacaja = false;
// lseguir = false;
// }
// }
// m++;
// }
// if (lenmismacaja)
// {
// // todas las ocurrencias de i para la fila j estan en la caja [(j-(j%3))/3,(k-(k%3))/3]
// // entonces eliminar candidatos i del resto de la caja
// for (int p = j-(j%3); p <= j-(j%3)+2; p++)
// {
// for (int q = k - (k % 3); q <= k - (k % 3)+2; q++)
// {
// if (p != j)
// {
// pos3 = EncontrarNumeroEnArreglo(aPosibilidades[p, q], i);
// if (pos3 > -1)
// {
// aPosibilidades[p, q] = EliminarPosicionDeArreglo(aPosibilidades[p, q], pos3);
// lencontrado = true;
// tbMensajes.Text = string.Concat("Locked Candidates:Claim. ", i, " reclama la fila ", j, " en la caja [", (j - (j % 3)) / 3, ",", (k - (k % 3)) / 3, "]");
// }
// }
// }
// }
// }
// }
// }
// k++;
// }
// j++;
// }
// // ahora revisar cada columna
// j = 0;
// while (!lencontrado & j < 9)
// {
// bool lseguir = true;
// int k = 0;
// // barrer toda la fila
// while (lseguir & k < 9)
// {
// if (aTablero[k, j] == 0)
// {
// pos = EncontrarNumeroEnArreglo(aPosibilidades[k,j], i);
// if (pos > -1)
// {
// bool lenmismacaja = true;
// int m = k + 1, pos2, pos3;
// while (lenmismacaja & m < 9)
// {
// pos2 = EncontrarNumeroEnArreglo(aPosibilidades[m, j], i);
// if (pos2 > -1)
// {
// // si [k,j] y [m,j] estan en diferente caja. sonamos
// if (k - (k % 3) != m - (m % 3))
// {
// lenmismacaja = false;
// lseguir = false;
// }
// }
// m++;
// }
// if (lenmismacaja)
// {
// // todas las ocurrencias de i para la columna j estan en la caja [(k-(k%3))/3,(j-(j%3))/3]
// // entonces eliminar candidatos i del resto de la caja
// for (int p = k - (k % 3); p <= k - (k % 3) + 2; p++)
// {
// for (int q = j - (j % 3); q <= j - (j % 3) + 2; q++)
// {
// if (q != j)
// {
// pos3 = EncontrarNumeroEnArreglo(aPosibilidades[p, q], i);
// if (pos3 > -1)
// {
// aPosibilidades[p, q] = EliminarPosicionDeArreglo(aPosibilidades[p, q], pos3);
// lencontrado = true;
// tbMensajes.Text = string.Concat("Locked Candidates:Claim. ", i, " reclama la columna ", j, " en la caja [",(k - (k % 3)) / 3,",", (j - (j % 3)) / 3, "]");
// }
// }
// }
// }
// }
// }
// }
// k++;
// }
// j++;
// }
// i++;
// }
// // Locked Candidates Pointing
// i = 0;
// while (!lencontrado & i < 9)
// {
// j = 0;
// while (!lencontrado & j < 9)
// {
// if (aTablero[i,j] == 0)
// {
// int k = 0, nValor;
// while (!lencontrado & k < aPosibilidades[i,j].Length)
// {
// nValor = aPosibilidades[i, j][k];
// //suponemos que todas las ocurrencias de nValor estan en la fila i y probamos lo contrario
// bool lTodasEnFila = true;
// for (int m = i - (i%3); m <= (i - (i % 3)) + 2; m++)
// {
// for (int n = j-(j%3); n <= (j - (j % 3)) + 2; n++)
// {
// if (m != i)
// {
// pos = EncontrarNumeroEnArreglo(aPosibilidades[m, n], nValor);
// if (pos > -1)
// {
// // existe por lo menos una ocurrencia de nValor en la misma caja en otra fila
// lTodasEnFila = false;
// }
// }
// }
// }
// if (lTodasEnFila)
// {
// // En la fila i, los unicos candidatos validos para nValor estan en la caja donde esta la celda [i,j]
// // eliminar los candidatos en el resto de la fila
// for (int n = 0; n < 9; n++)
// {
// if ((n<j-(j%3) )| (n > j-(j%3)+2))
// {
// if (aTablero[i,n] == 0)
// {
// pos =EncontrarNumeroEnArreglo(aPosibilidades[i,n], nValor);
// if (pos > -1)
// {
// lencontrado = true;
// aPosibilidades[i, n] = EliminarPosicionDeArreglo(aPosibilidades[i, n], pos);
// tbMensajes.Text = string.Concat("Locked Candidates: Pointing. ", nValor, " reclama la fila ", i, " en la caja [", (i-(i%3))/3,",",(j-(j%3))/3,"]");
// }
// }
// }
// }
// }
// if (!lencontrado)
// {
// //suponemos que todas las ocurrencias de nValor estan en la columna j y probamos lo contrario
// bool lTodasEnColumna = true;
// for (int m = i-(i%3); m <= (i - (i % 3)) + 2; m++)
// {
// for (int n = j - (j%3); n <= (j - (j % 3)) + 2; n++)
// {
// if (n != j)
// {
// pos = EncontrarNumeroEnArreglo(aPosibilidades[m, n], nValor);
// if (pos > -1)
// {
// // existe por lo menos una ocurrencia de nValor en la misma caja en otra columna
// lTodasEnColumna = false;
// }
// }
// }
// }
// if (lTodasEnColumna)
// {
// // En la columna j, los unicos candidatos validos para nValor estan en la caja donde esta la celda [i,j]
// // eliminar los candidatos en el resto de la fila
// for (int n = 0; n < 9; n++)
// {
// if ((n < i - (i % 3)) | (n > i - (i % 3) + 2))
// {
// if (aTablero[n, j] == 0)
// {
// pos = EncontrarNumeroEnArreglo(aPosibilidades[n, j], nValor);
// if (pos > -1)
// {
// lencontrado = true;
// aPosibilidades[n, j] = EliminarPosicionDeArreglo(aPosibilidades[n, j], pos);
// tbMensajes.Text = string.Concat("Locked Candidates: Pointing. ", nValor, " reclama la columna ", j, " en la caja [", (i - (i % 3)) / 3, ",", (j - (j % 3)) / 3, "]");
// }
// }
// }
// }
// }
// }
// k++;
// }
// }
// j++;
// }
// i++;
// }
// }
// if (lresuelto)
// tbMensajes.Text = "Sudoku resuelto";
// else if (!lencontrado)
// {
// //X wing
// i = 1; // representa al digito en analisis
// int m; // indicador de fila
// int [] aXWing = new int [3];
// int [] aXWing2 = new int[3];
// while (!lencontrado & i <=9)
// {
// // revisar si en las filas hay un XWing
// m = 0; // indicador de fila
// while (!lencontrado & m < 8) // no tiene sentido revisar la ultima fila
// {
// // ver si en la fila M hay exactamente 2 ocurrencias del digito i
// int nveces = 0, xxx;
// for (j = 0; j < 9; j++)
// {
// xxx = EncontrarNumeroEnArreglo(aPosibilidades[m, j], i);
// if (xxx > -1 & nveces < 3 )
// {
// aXWing[nveces] = j;
// nveces++;
// }
// }
// // si hay 2 ocurrencias del digito i que no estan en la misma caja
// if (nveces == 2)
// {
// if (CompartenCaja(m, aXWing[0], m, aXWing[1]) == 0)
// {
// // entonces buscar desde la siguiente fila hacia abajo
// int k = m + 1;
// while (!lencontrado & k < 9)
// {
// // ver si en esa fila hay solo 2 ocurrencias
// nveces = 0;
// for (j = 0; j < 9; j++)
// {
// xxx = EncontrarNumeroEnArreglo(aPosibilidades[k, j], i);
// if (xxx > -1 & nveces < 3)
// {
// aXWing2[nveces] = j;
// nveces++;
// }
// }
// // si hay 2 ocurrencias, comprobar en que columnas estan
// if (nveces == 2)
// {
// if (aXWing[0] == aXWing2[0] & aXWing[1] == aXWing2[1])
// {
// // encontrado un XWing en filas m y k para el digito i, columnas aXWing[0] y aXWing[1]
// // eliminar los candidatos para el digito i en las columnas aXWing[0] y aXWing[1] que no esten en las filas m o k
// int jk = 0;
// while (jk < 2)
// {
// for (int xy = 0; xy < 9; xy++) //xy indicara la fila
// {
// if (xy != m & xy != k)
// {
// pos = EncontrarNumeroEnArreglo(aPosibilidades[xy, aXWing[jk]], i);
// if (pos > -1)
// {
// lencontrado = true;
// aPosibilidades[xy, aXWing[jk]] = EliminarPosicionDeArreglo(aPosibilidades[xy, aXWing[jk]], pos);
// tbMensajes.Text = string.Concat("XWing. ", i, " en celdas [", m, ",", aXWing[0], "], [", m, ",", aXWing[1], "], [",k,",",aXWing[0] ,"] y [", k, ",", aXWing[1], "]. Candidatos eliminados en las columnas.");
// }
// }
// }
// jk++;
// }
// }
// }
// k++;
// }
// }
// }
// m++;
// }
// // revisar si en las columnas hay un XWing
// m = 0; // indicador de columna
// while (!lencontrado & m < 8) // no tiene sentido revisar la ultima columna
// {
// // ver si en la columna m hay exactamente 2 ocurrencias del digito i
// int nveces = 0, xxx;
// for (j = 0; j < 9; j++)
// {
// xxx = EncontrarNumeroEnArreglo(aPosibilidades[j, m], i);
// if (xxx > -1 & nveces < 3)
// {
// aXWing[nveces] = j;
// nveces++;
// }
// }
// // si hay 2 ocurrencias del digito i que no estan en la misma caja
// if (nveces == 2)
// {
// if (CompartenCaja(aXWing[0], m, aXWing[1], m) == 0)
// {
// // entonces buscar desde la siguiente columna hacia la derecha
// int k = m + 1;
// while (!lencontrado & k < 9)
// {
// // ver si en esa columna hay solo 2 ocurrencias
// nveces = 0;
// for (j = 0; j < 9; j++)
// {
// xxx = EncontrarNumeroEnArreglo(aPosibilidades[j, k], i);
// if (xxx > -1 & nveces < 3)
// {
// aXWing2[nveces] = j;
// nveces++;
// }
// }
// // si hay 2 ocurrencias, comprobar en que filas estan
// if (nveces == 2)
// {
// if (aXWing[0] == aXWing2[0] & aXWing[1] == aXWing2[1])
// {
// // encontrado un XWing en columnas m y k para el digito i, filas aXWing[0] y aXWing[1]
// // eliminar los candidatos para el digito i en las filas aXWing[0] y aXWing[1] que no esten en las columnas m o k
// int jk = 0;
// while (jk < 2)
// {
// for (int xy = 0; xy < 9; xy++) //xy indicara la columna
// {
// if (xy != m & xy != k)
// {
// pos = EncontrarNumeroEnArreglo(aPosibilidades[aXWing[jk], xy], i);
// if (pos > -1)
// {
// lencontrado = true;
// aPosibilidades[aXWing[jk], xy] = EliminarPosicionDeArreglo(aPosibilidades[aXWing[jk], xy], pos);
// tbMensajes.Text = string.Concat("XWing. ", i, " en celdas [", aXWing[0], ",", m, "], [", aXWing[1], ",", m, "], [", aXWing[0], ",", k, "] y [", aXWing[1], ",", k, "]. Candidatos eliminados en las filas.");
// }
// }
// }
// jk++;
// }
// }
// }
// k++;
// }
// }
// }
// m++;
// }
// i++;
// }
// // Hidden Pair
// // Para cada digito IJK