private static void Backtrack(MagicSquare ms) { if (!ms.IsReady()) { // candidate values are from 1 to 9 in case of a magic square of size 3 for (int i = 1; i < MagicSquare.Size * MagicSquare.Size + 1; i++) { if (!ms.CandidateUsed(i)) { MagicSquare msCopy = ms.DeepCopy(); msCopy.SetCandidate(i); Backtrack(msCopy); } } } }