/// <summary>
        /// Attempt to advance the <see cref="SudokuPuzzle"/> by finding regions (i.e. blocks, rows, or columns)
        /// where only one <see cref="Cell"/> has not been solved, then solving that <see cref="Cell"/>
        /// </summary>
        /// <param name="puzzle">The <see cref="SudokuPuzzle"/> being advanced</param>
        /// <param name="candidateCells">A list of <see cref="Cell"/>s, each of which is the single unsolved cell in a region</param>
        /// <returns>Whether the <see cref="SudokuPuzzle"/> ends up being advanced</returns>
        protected override bool MessWithPuzzle(SudokuPuzzle puzzle, List <Cell> candidateCells)
        {
            bool hasAdvanced = false;

            for (int i = 0; i < candidateCells.Count; ++i)
            {
                if (this.SolveCell(candidateCells[i], puzzle.GetAllAllowedValues()))
                {
                    hasAdvanced = true;
                }
            }

            return(hasAdvanced);
        }
        public void TestAllowedValues()
        {
            int        dimension  = 3;
            List <int> cellValues = new List <int>();

            for (int i = 0; i < dimension * dimension * dimension * dimension; ++i)
            {
                cellValues.Add(0);
            }

            SudokuPuzzle puzzle = new SudokuPuzzle(dimension, cellValues);

            List <int> allowedValues = puzzle.GetAllAllowedValues();

            for (int i = 0; i < dimension * dimension; ++i)
            {
                Assert.IsTrue(allowedValues[i] == i + 1);
            }
        }