/// <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); }