private void RechecheSolutions(int lvl, Carre carre) { foreach (Arrangement argt in arrangements) { if (!ArrangementCompatibleAvecPositionNombre1(argt, lvl)) { continue; } if (carre.Compatible(lvl, argt)) { carre[lvl] = argt; if (lvl == 3) { if (carre.Solution) { solutions.Add(new Carre(carre)); } } else { RechecheSolutions(lvl + 1, carre); } } } }
private void SauveSolution(Carre carre, ExcelWorksheet sheet, int idxRow, int idxCol) { for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { ExcelRange range = sheet.Cells[idxRow + y, idxCol + x]; range.Value = carre[y][x]; range.Style.Border.BorderAround(OfficeOpenXml.Style.ExcelBorderStyle.Thin); range.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; range.Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; } } }
public void RechercheArrangements() { Stopwatch sw = Stopwatch.StartNew(); arrangements = new List <Arrangement>(); Arrangement argt = new Arrangement(new int[] { 0, 0, 0, 0 }); // 2064 arrangements de 4 sur 16 de somme 34, en 4 ms RechercheArrangements(0, argt); Debug.Print($"{arrangements.Count} arrangements de 4 sur 16 de somme 34, en {sw.ElapsedMilliseconds} ms"); sw.Restart(); solutions = new List <Carre>(); Carre carre = new Carre(); foreach (Point positionNombre1 in positionsNombre1) { this.positionNombre1 = positionNombre1; RechecheSolutions(0, carre); } Debug.Print($"{solutions.Count} solutions de carré magique 4x4 avec les nombres 1 à 16, en {sw.ElapsedMilliseconds} ms"); // 1296 solutions de carré magique 4x4 normaux, en 2h15mn SauveSolutions(); }