private IEnumerable <Pair <Cube> > FillOutMinimalCubePair(Pair <Cube> cubes) { Cube a = cubes.a, b = cubes.b; if (a.Count == 6 && b.Count == 6) { yield return(new Pair <Cube> { a = a, b = b }); Cube tempA = new Cube(a), tempB = new Cube(b); if (a.Contains(6) && !a.Contains(9)) { tempA.Remove(6); tempA.Add(9); yield return(new Pair <Cube> { a = tempA, b = b }); } if (b.Contains(6) && !b.Contains(9)) { tempB.Remove(6); tempB.Add(9); yield return(new Pair <Cube> { a = a, b = tempB }); } if (a.Contains(6) && !a.Contains(9) && b.Contains(6) && !b.Contains(9)) { yield return(new Pair <Cube> { a = tempA, b = tempB }); } yield break; } if (a.Count < 6) { for (int i = 0; i < 10; i++) { if (!a.Contains(i)) { var tempA = new Cube(a); tempA.Add(i); foreach (var cube in FillOutMinimalCubePair(new Pair <Cube> { a = tempA, b = b })) { yield return(cube); } } } } if (b.Count < 6) { for (int i = 0; i < 10; i++) { if (!b.Contains(i)) { var tempB = new Cube(b); tempB.Add(i); foreach (var cube in FillOutMinimalCubePair(new Pair <Cube> { a = a, b = tempB })) { yield return(cube); } } } } }
//private List<Pair<Cube>> cubePairs = new List<Pair<Cube>>(); private IEnumerable <Pair <Cube> > GenerateMinimalCubes(int square, Cube cube1, Cube cube2) { if (cube1.Count > 6 || cube2.Count > 6) { yield break; } if (square == 9) { //cubePairs.Add(new Pair<Cube> { a = cube1, b = cube2 }); yield return(new Pair <Cube> { a = cube1, b = cube2 }); yield break; } var pair = _squares[square]; var newCube11 = new Cube(cube1); var newCube12 = new Cube(cube1); var newCube21 = new Cube(cube2); var newCube22 = new Cube(cube2); bool anyAdded = false; // add a to left, b to right if (!newCube11.Contains(pair.a)) { newCube11.Add(pair.a); anyAdded = true; } if (!newCube21.Contains(pair.b)) { newCube21.Add(pair.b); anyAdded = true; } foreach (var cubes in GenerateMinimalCubes(square + 1, newCube11, newCube21)) { yield return(cubes); } // add b to left, c to right if (!newCube12.Contains(pair.b)) { newCube12.Add(pair.b); anyAdded = true; } if (!newCube22.Contains(pair.a)) { newCube22.Add(pair.a); anyAdded = true; } if (anyAdded) { foreach (var cubes in GenerateMinimalCubes(square + 1, newCube12, newCube22)) { yield return(cubes); } } }