public void SetAndClearTest() { ng.Set(4, 3, true); Assert.AreEqual(true, ng.IsTrue(4, 3)); Assert.AreEqual(true, ng.Resolved(4, 3)); Assert.AreEqual(19, ng.LeftToClear); ng.Set(4, 3, false); Assert.AreEqual(false, ng.IsTrue(4, 3)); Assert.AreEqual(true, ng.Resolved(4, 3)); Assert.AreEqual(19, ng.LeftToClear); ng.Clear(4, 3); Assert.AreEqual(false, ng.IsTrue(4, 3)); Assert.AreEqual(false, ng.Resolved(4, 3)); Assert.AreEqual(20, ng.LeftToClear); }
private bool CheckNonogram(bool[][] jArr, Nonogram ng) { for (int i = 0; i < jArr.Length; i++) { for (int j = 0; j < jArr[0].Length; j++) { if (!ng.Resolved(i, j) || jArr[i][j] != ng.IsTrue(i, j)) { return(false); } } } return(true); }
/// <summary> /// Attempt to solve the given nonogram /// </summary> /// <param name="ng">Nonogram to solve</param> /// <returns>Number of resolved tiles</returns> public int Run(Nonogram ng) { _ng = ng; _resultStack = new List <Result>(); _solved = false; _grid = new bool?[ng.Height][]; for (int i = 0; i < ng.Height; i++) { _grid[i] = new bool?[ng.Width]; for (int j = 0; j < ng.Width; j++) { if (ng.Resolved(i, j)) { _grid[i][j] = ng.IsTrue(i, j); } else { _grid[i][j] = null; } } } Stopwatch sw = Stopwatch.StartNew(); int resolved = Treesolve(0, 0); sw.Stop(); _benchTime = sw.Elapsed; if (resolved == -1) { return(0); } _solved = true; for (int i = 0; i < ng.Height; i++) { for (int j = 0; j < ng.Width; j++) { if (!ng.Resolved(i, j) && _grid[i][j].HasValue) { _resultStack.Push(new Result(i, j, _grid[i][j].Value)); } } } return(resolved); }
/// <summary> /// Fills the leftInts array with all blocks as far up as possible /// </summary> /// <param name="column">column index</param> /// <param name="leftInts">array to edit</param> /// <param name="clueIndex">clue to use for this step in recursion</param> /// <param name="colPos">current fill position of array. (used for recursion)</param> /// <returns>false if a contradiction is encountered</returns> private bool ColLeft(int column, int[] leftInts, int clueIndex, int colPos) { int clue = _ng.GetColumnNum(column, clueIndex); if (clue == 0) { for (int i = colPos; i < _ng.Height; i++) { if (_ng.IsTrue(i, column)) { return(false); } leftInts[i] = clueIndex * 2 - 1; } return(true); } int localPos = colPos; bool posChanged; while (true) { posChanged = false; for (int i = localPos; i < localPos + clue; i++) { if (i >= leftInts.Length) { return(false); } if (_ng.IsFalse(i, column)) { for (int j = localPos; j <= i; j++) { if (_ng.IsTrue(j, column)) { 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(localPos + clue, column)) { leftInts[localPos + clue] = clueIndex * 2 + 1; if (ColLeft(column, leftInts, clueIndex + 1, localPos + clue + 1)) { return(true); } if (_ng.IsTrue(localPos, column)) { return(false); } } leftInts[localPos] = clueIndex * 2 - 1; localPos++; } }