private bool fuerzaBruta(List <Cuadro> fichas, int i, int j)
 {
     comparaciones++;
     if (j == n)
     {
         asignaciones += 2;
         i++;
         j = 0;
     }
     comparaciones += 2;
     if ((i == n - 1) & (j == n - 1))
     {
         asignaciones++;
         matrizFichas[i][j] = fichas[0];
         comparaciones++;
         if (Comprobar())
         {
             ImprimirFichas(matrizFichas);
             return(true);
         }
         else
         {
             return(false);
         }
     }
     else
     {
         asignaciones++;
         comparaciones += fichas.Count + 1;
         asignaciones  += fichas.Count;
         for (int count = 0; count < fichas.Count; count++)
         {
             asignaciones++;
             Cuadro ficha = fichas[0];
             asignaciones++;
             matrizFichas[i][j] = ficha;
             fichas.RemoveAt(0);
             comparaciones++;
             if (fuerzaBruta(fichas, i, j + 1))
             {
                 return(true);
             }
             fichas.Add(ficha);
         }
         return(false);
     }
 }
        /// <summary>
        /// Funcion que se encarga de revolver las fichas para iniciar el juego
        /// </summary>
        public void DesordenarFichas()
        {
            Random randNum = new Random();
            Cuadro aux = null;
            int    fls = 0, clmn = 0;

            for (int veces = 0; veces < 5; veces++) // este otro ciclo es opcional, pero si solamente se utilizando los dos ciclos no queda bien resuelto porque normalmente quedan acomodadas siguiendo un patron
            {
                for (int f = 0; f < matrizFichas.Count; f++)
                {
                    for (int c = 0; c < matrizFichas.Count; c++)
                    {
                        fls  = randNum.Next(0, matrizFichas.Count);
                        clmn = randNum.Next(0, matrizFichas.Count);

                        // intercambio de objetos para desordenar
                        aux = matrizFichas[f][c];                          // respaldo el objeto de esa posicion
                        matrizFichas[f][c]      = matrizFichas[fls][clmn]; // asigno un objeto de una posicion aleatoria
                        matrizFichas[fls][clmn] = aux;
                    }
                }
            }
        }
 private bool subordinadoSelectivo(int i, int j, List <Cuadro>[] arreglo, int anterior)
 {
     if (j == n)
     {
         i = i + 1;
         j = 0;
     }
     if ((i == n - 1) && (j == n - 1))
     {
         for (int a = 0; a < 10; a++)
         {
             if (arreglo[a].Count > 0)
             {
                 matrizFichas[i][j] = arreglo[a][0];
                 break;
             }
         }
         if (Comprobar())
         {
             ImprimirFichas(matrizFichas);
             return(true);
         }
         else
         {
             return(false);
         }
     }
     else
     {
         if (j == 0)
         {
             for (int a = 0; a < 10; a++)
             {
                 for (int m = 0; m < arreglo[a].Count; m++)
                 {
                     Cuadro tmp = arreglo[a][0];
                     arreglo[a].RemoveAt(0);
                     if (i != 0)
                     {
                         if (tmp.up != matrizFichas[i - 1][j].down)
                         {
                             arreglo[a].Add(tmp);
                             continue;
                         }
                     }
                     matrizFichas[i][j] = tmp;
                     if (subordinadoSelectivo(i, j + 1, arreglo, tmp.right))
                     {
                         return(true);
                     }
                     arreglo[a].Add(tmp);
                 }
             }
         }
         else
         {
             for (int k = 0; k < arreglo[anterior].Count; k++)
             {
                 Cuadro tmp = arreglo[anterior][0];
                 arreglo[anterior].RemoveAt(0);
                 if (i != 0)
                 {
                     if (tmp.up != matrizFichas[i - 1][j].down)
                     {
                         arreglo[anterior].Add(tmp);
                         continue;
                     }
                 }
                 matrizFichas[i][j] = tmp;
                 if (subordinadoSelectivo(i, j + 1, arreglo, tmp.right))
                 {
                     return(true);
                 }
                 arreglo[anterior].Add(tmp);
             }
         }
     }
     return(false);
 }