Exemple #1
0
        /// <summary>
        /// Attempt to generate results for a specific row
        /// </summary>
        /// <param name="row">Row index</param>
        /// <returns>False if an error was found. else true</returns>
        private bool InitRow(int row)
        {
            int[] rowArr = _ng.GetRowArray(row);
            if (_ng.Width - (rowArr.Sum() + rowArr.Length - 1) == 0)
            {
                return(Fillrow(row, rowArr));
            }
            int[] rowInts = new int[_ng.Width];
            int   idx     = 0;

            for (int i = 0; i < rowArr.Length; i++)
            {
                for (int j = 0; j < rowArr[i]; j++)
                {
                    rowInts[idx] = i + 1;
                    idx++;
                }
                idx++;
            }
            idx = _ng.Width - 1;
            for (int i = rowArr.Length - 1; i >= 0; i--)
            {
                for (int j = 0; j < rowArr[i]; j++)
                {
                    if (rowInts[idx] == i + 1)
                    {
                        _results.Add(new Result(row, idx, true));
                        _marked[row][i] = true;
                    }
                    idx--;
                }
                idx--;
            }
            return(true);
        }
        /// <summary>
        /// Evaluates the specified row
        /// </summary>
        /// <param name="index">row index</param>
        /// <returns>False if a contradiction is encountered</returns>
        private bool FillRow(int index)
        {
            bool solved = true;

            for (int i = 0; i < _ng.Width; i++)
            {
                if (!_ng.Resolved(index, i))
                {
                    solved = false;
                    break;
                }
            }
            if (solved)
            {
                return(true);
            }
            int[] leftInts = new int[_ng.Width];
            if (!RowLeft(index, leftInts, 0, 0))
            {
                return(false);
            }
            int[] rightInts = new int[_ng.Width];
            RowRight(index, rightInts, _ng.GetRowArray(index).Length - 1, _ng.Width - 1);
            for (int i = 0; i < leftInts.Length; i++)
            {
                if (leftInts[i] == rightInts[i] && !_ng.Resolved(index, i))
                {
                    bool state = leftInts[i] % 2 == 0;
                    _colChanged[i]     = true;
                    _rowChanged[index] = true;
                    _resultList.Add(new Result(index, i, state));
                    _ng.Set(index, i, state);
                }
            }
            return(true);
        }