예제 #1
0
 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);
 }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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++;
            }
        }