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); }