/// <summary> /// Fills the leftInts array with all blocks as far left as possible /// </summary> /// <param name="row">row index</param> /// <param name="leftInts">array to edit</param> /// <param name="clueIndex">clue to use for this step in recursion</param> /// <param name="rowPos">current fill position of array. (used for recursion)</param> /// <returns>false if a contradiction is encountered</returns> private bool RowLeft(int row, int[] leftInts, int clueIndex, int rowPos) { int clue = _ng.GetRowNum(row, clueIndex); if (clue == 0) { for (int i = rowPos; i < leftInts.Length; i++) { if (_ng.IsTrue(row, i)) { return(false); } leftInts[i] = clueIndex * 2 - 1; } return(true); } int localPos = rowPos; bool posChanged; while (true) { posChanged = false; for (int i = localPos; i < localPos + clue; i++) { if (i >= leftInts.Length) { return(false); } if (_ng.IsFalse(row, i)) { for (int j = localPos; j <= i; j++) { if (_ng.IsTrue(row, j)) { return(false); } leftInts[j] = clueIndex * 2 - 1; } localPos = i + 1; posChanged = true; break; } leftInts[i] = clueIndex * 2; } if (posChanged) { continue; } if (localPos + clue >= leftInts.Length) { return(true); } if (!_ng.IsTrue(row, localPos + clue)) { leftInts[localPos + clue] = clueIndex * 2 + 1; if (RowLeft(row, leftInts, clueIndex + 1, localPos + clue + 1)) { return(true); } if (_ng.IsTrue(row, localPos)) { return(false); } } leftInts[localPos] = clueIndex * 2 - 1; localPos++; } }
/// <summary> /// Checks nonogram for obvious errors related to specified tile. /// </summary> /// <param name="row">Row index of tile</param> /// <param name="column">Column index of tile</param> /// <returns>True if error was found.</returns> private bool Error(int row, int column) { int lineSum = _ng.RowSum(row); for (int i = 0; i < _ng.Width; i++) { if (_grid[row][i].HasValue && _grid[row][i].Value) { lineSum--; } if (lineSum < 0) { return(true); } } lineSum = _ng.ColumnSum(column); for (int i = 0; i < _ng.Height; i++) { if (_grid[i][column].HasValue && _grid[i][column].Value) { lineSum--; } if (lineSum < 0) { return(true); } } if (_grid[row].All(x => x.HasValue)) { int num = 0; List <int> nums = new List <int>(); for (int i = 0; i < _ng.Width; i++) { if (_grid[row][i].HasValue && _grid[row][i].Value) { num++; } else { if (num != 0) { nums.Add(num); } num = 0; } } if (num != 0) { nums.Add(num); } for (int i = 0; i < nums.Count; i++) { if (nums[i] != _ng.GetRowNum(row, i)) { return(true); } } if (_ng.GetRowNum(row, nums.Count) != 0) { return(true); } } if (_grid.All(x => x[column].HasValue)) { int num = 0; List <int> nums = new List <int>(); for (int i = 0; i < _ng.Height; i++) { if (_grid[i][column].HasValue && _grid[i][column].Value) { num++; } else { if (num != 0) { nums.Add(num); } num = 0; } } if (num != 0) { nums.Add(num); } for (int i = 0; i < nums.Count; i++) { if (nums[i] != _ng.GetColumnNum(column, i)) { return(true); } } if (_ng.GetColumnNum(column, nums.Count) != 0) { return(true); } } return(false); }
public void GetRowNumTest() { Assert.AreEqual(4, ng.GetRowNum(0, 0)); Assert.AreEqual(0, ng.GetRowNum(0, 1)); Assert.AreEqual(1, ng.GetRowNum(1, 1)); }