private IEnumerable<RotatedPiece> GetNextOrientationPermutation(RotatedPieceHolder[] orderPermutation) { var lastPiece = orderPermutation.Last(); if (lastPiece.RotationNumber > 4) { lastPiece.Reset(); if (!RotateEarlierPieces(orderPermutation)) return null; } var rotatedPieces = (from rph in orderPermutation select new RotatedPiece(rph.Piece, rph.Orientation)).ToList(); lastPiece.Rotate(); return rotatedPieces; }
private bool RotateEarlierPieces(RotatedPieceHolder[] orderPermutation) { int numPieces = orderPermutation.Length; if (numPieces <= 1) return false; var indexZeroHasBeenReset = false; for (int i = numPieces - 2; i >= 0; i--) { if (orderPermutation[i].RotationNumber < 4) { orderPermutation[i].Rotate(); break; } orderPermutation[i].Reset(); indexZeroHasBeenReset = i == 0; } return !indexZeroHasBeenReset; }