public bool ValidSudokuBox()
        {
            bool IsValid = true;

            elemList.ForEach(elem =>
            {
                if (IsValid == false)
                {
                    return;
                }

                sudokuelem elemRow = elemList.Find(x => x.x == elem.x && x.y != elem.y && elem.value == x.value && x.value != 0);
                sudokuelem elemCol = elemList.Find(x => x.y == elem.y && x.x != elem.x && elem.value == x.value && x.value != 0);
                sudokuelem elemBox =
                    elemList.Find(x =>
                                  (x.x != elem.x && x.y != elem.y) &&
                                  (x.x / 3 == elem.x / 3 && x.y / 3 == elem.y / 3) &&
                                  (x.value == elem.value && x.value != 0));

                if (elemCol != null || elemRow != null || elemBox != null)
                {
                    IsValid = false;
                    return;
                }
            });
            return(IsValid);
        }
        public bool SolveSudoku()
        {
            sudokuelem nextElem     = elemList.Find(x => x.value == 0);
            List <int> tempElemList = new List <int>()
            {
                1, 2, 3, 4, 5, 6, 7, 8, 9
            };
            bool IsSolved = false;

            if (!ValidSudokuBox())
            {
                return(false);
            }

            // All filed up
            if (nextElem == null)
            {
                return(true);
            }

            elemList.ForEach(x =>
            {
                if ((x.value != 0) && (x.x == nextElem.x || x.y == nextElem.y ||
                                       (x.x / 3 == nextElem.x / 3 && x.y / 3 == nextElem.y / 3)))
                {
                    tempElemList.Remove(x.value);
                }
            });

            tempElemList.ForEach(elem =>
            {
                if (IsSolved == false)
                {
                    nextElem.value = elem;
                    IsSolved       = SolveSudoku();
                    if (IsSolved == false)
                    {
                        nextElem.value = 0;
                    }
                }
            });

            nextElem = elemList.Find(x => x.value == 0);

            // All filed up
            if (nextElem == null)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }