/// <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++;
            }
        }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
 public void GetRowNumTest()
 {
     Assert.AreEqual(4, ng.GetRowNum(0, 0));
     Assert.AreEqual(0, ng.GetRowNum(0, 1));
     Assert.AreEqual(1, ng.GetRowNum(1, 1));
 }