コード例 #1
0
ファイル: Form1.cs プロジェクト: Formadill/Sudoku-Solver
        private void calculate()
        {
            bool foundAnswer = false;
            //verticals
            foreach (List<TextBox> row in verticals)
            {
                List<int> prefilleds = new List<int>();
                List<int> leftovers = new List<int>();
                foreach (TextBox box in row)
                {
                    if (box.Text != "")
                    {
                        prefilleds.Add(Convert.ToInt32(box.Text));
                    }
                }
                for (int i = 1; i <= 9; i++)
                {
                    bool canFill = true;
                    foreach (int prefilled in prefilleds)
                    {
                        if (i == prefilled)
                            canFill = false;
                    }
                    if (canFill)
                        leftovers.Add(i);
                }
                List<Tuple<TextBox, int>> boxOver = new List<Tuple<TextBox, int>>();
                foreach (TextBox box in row)
                {
                    List<int> Leftovers = leftovers;
                    if (box.Text == "")
                    {
                        for (int i = 0; i <= Leftovers.Count - 1; i++)
                        {
                            int leftover = Leftovers[i];
                            bool canPlace = true;
                            bool _CanPlace = true;
                            bool _canPlace = true;
                            int xValue = getTextBoxXY(box).Item1;
                            int zValue = getTextBoxXY(box).Item3;
                            foreach (TextBox checkBox in horizontals[xValue - 1])
                            {
                                if (checkBox.Name != box.Name)
                                    if (checkBox.Text == leftover.ToString())
                                        _canPlace = false;
                            }
                            foreach (TextBox checkBox in squares[zValue - 1])
                            {
                                if (checkBox.Name != box.Name)
                                    if (checkBox.Text == leftover.ToString())
                                        _CanPlace = false;
                            }
                            if (_CanPlace == false || _canPlace == false)
                                canPlace = false;
                            if (canPlace)
                            {
                                boxOver.Add(new Tuple<TextBox, int>(box, leftover));
                            }
                        }
                    }
                }

                List<Tuple<TextBox, int>> s1 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s2 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s3 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s4 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s5 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s6 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s7 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s8 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s9 = new List<Tuple<TextBox, int>>();
                foreach (Tuple<TextBox, int> tuple in boxOver)
                {
                    if (tuple.Item2 == 1)
                    {
                        s1.Add(tuple);
                    }
                    if (tuple.Item2 == 2)
                        s2.Add(tuple);
                    if (tuple.Item2 == 3)
                        s3.Add(tuple);
                    if (tuple.Item2 == 4)
                        s4.Add(tuple);
                    if (tuple.Item2 == 5)
                        s5.Add(tuple);
                    if (tuple.Item2 == 6)
                        s6.Add(tuple);
                    if (tuple.Item2 == 7)
                        s7.Add(tuple);
                    if (tuple.Item2 == 8)
                        s8.Add(tuple);
                    if (tuple.Item2 == 9)
                        s9.Add(tuple);
                }
                List<List<Tuple<TextBox, int>>> tupList = new List<List<Tuple<TextBox, int>>>();
                tupList.Add(s1);
                tupList.Add(s2);
                tupList.Add(s3);
                tupList.Add(s4);
                tupList.Add(s5);
                tupList.Add(s6);
                tupList.Add(s7);
                tupList.Add(s8);
                tupList.Add(s9);
                foreach (List<Tuple<TextBox, int>> tups in tupList)
                {
                    if (tups.Count == 1)
                    {
                        tups[0].Item1.Text = tups[0].Item2.ToString();
                        foundAnswer = true;
                    }
                }
            }

            //horizontals
            foreach (List<TextBox> row in horizontals)
            {
                List<int> prefilleds = new List<int>();
                List<int> leftovers = new List<int>();
                foreach (TextBox box in row)
                {
                    if (box.Text != "")
                    {
                        prefilleds.Add(Convert.ToInt32(box.Text));
                    }
                }
                for (int i = 1; i <= 9; i++)
                {
                    bool canFill = true;
                    foreach (int prefilled in prefilleds)
                    {
                        if (i == prefilled)
                            canFill = false;
                    }
                    if (canFill)
                        leftovers.Add(i);
                }
                List<Tuple<TextBox, int>> boxOver = new List<Tuple<TextBox, int>>();
                foreach (TextBox box in row)
                {
                    List<int> Leftovers = leftovers;
                    if (box.Text == "")
                    {
                        for (int i = 0; i <= Leftovers.Count - 1; i++)
                        {
                            int leftover = Leftovers[i];
                            bool canPlace = true;
                            bool _canPlace = true;
                            bool _CanPlace = true;
                            int xValue = getTextBoxXY(box).Item2;
                            int zValue = getTextBoxXY(box).Item3;
                            foreach (TextBox checkBox in verticals[xValue - 1])
                            {
                                if (checkBox.Name != box.Name)
                                    if (checkBox.Text == leftover.ToString())
                                        _canPlace = false;
                            }

                            foreach (TextBox checkBox in squares[zValue - 1])
                            {
                                if (checkBox.Name != box.Name)
                                    if (checkBox.Text == leftover.ToString())
                                        _CanPlace = false;
                            }
                            if (_CanPlace == false || _canPlace == false)
                                canPlace = false;
                            if (canPlace)
                            {
                                boxOver.Add(new Tuple<TextBox, int>(box, leftover));
                            }
                        }
                    }
                }

                List<Tuple<TextBox, int>> s1 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s2 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s3 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s4 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s5 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s6 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s7 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s8 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s9 = new List<Tuple<TextBox, int>>();
                foreach (Tuple<TextBox, int> tuple in boxOver)
                {
                    if (tuple.Item2 == 1)
                    {
                        s1.Add(tuple);
                    }
                    if (tuple.Item2 == 2)
                        s2.Add(tuple);
                    if (tuple.Item2 == 3)
                        s3.Add(tuple);
                    if (tuple.Item2 == 4)
                        s4.Add(tuple);
                    if (tuple.Item2 == 5)
                        s5.Add(tuple);
                    if (tuple.Item2 == 6)
                        s6.Add(tuple);
                    if (tuple.Item2 == 7)
                        s7.Add(tuple);
                    if (tuple.Item2 == 8)
                        s8.Add(tuple);
                    if (tuple.Item2 == 9)
                        s9.Add(tuple);
                }
                List<List<Tuple<TextBox, int>>> tupList = new List<List<Tuple<TextBox, int>>>();
                tupList.Add(s1);
                tupList.Add(s2);
                tupList.Add(s3);
                tupList.Add(s4);
                tupList.Add(s5);
                tupList.Add(s6);
                tupList.Add(s7);
                tupList.Add(s8);
                tupList.Add(s9);
                foreach (List<Tuple<TextBox, int>> tups in tupList)
                {
                    if (tups.Count == 1)
                    {
                        tups[0].Item1.Text = tups[0].Item2.ToString();
                        foundAnswer = true;
                    }
                }
            }

            //boxes
            foreach (List<TextBox> square in squares)
            {
                List<int> prefilleds = new List<int>();
                List<int> leftovers = new List<int>();
                foreach (TextBox box in square)
                {
                    if (box.Text != "")
                    {
                        prefilleds.Add(Convert.ToInt32(box.Text));
                    }
                }
                for (int i = 1; i <= 9; i++)
                {
                    bool canFill = true;
                    foreach (int prefilled in prefilleds)
                    {
                        if (i == prefilled)
                            canFill = false;
                    }
                    if (canFill)
                        leftovers.Add(i);
                }
                List<Tuple<TextBox, int>> boxOver = new List<Tuple<TextBox, int>>();
                foreach (TextBox box in square)
                {
                    List<int> Leftovers = leftovers;
                    if (box.Text == "")
                    {
                        for (int i = 0; i <= Leftovers.Count - 1; i++)
                        {
                            int leftover = Leftovers[i];
                            bool _canPlace = true;
                            bool _CanPlace = true;
                            bool _Canplace = true;
                            bool canPlace = true;
                            int xValue = getTextBoxXY(box).Item1;
                            int yValue = getTextBoxXY(box).Item2;
                            foreach (TextBox checkBox in horizontals[xValue - 1])
                            {
                                if (checkBox.Name != box.Name)
                                    if (checkBox.Text == leftover.ToString())
                                        _canPlace = false;
                            }
                            foreach (TextBox checkBox in verticals[yValue - 1])
                            {
                                if (checkBox.Name != box.Name)
                                    if (checkBox.Text == leftover.ToString())
                                        _CanPlace = false;
                            }
                            foreach (TextBox checkBox in square)
                            {
                                if (checkBox.Name != box.Name)
                                    if (checkBox.Text == leftover.ToString())
                                        _Canplace = false;
                            }
                            if (_CanPlace == false || _canPlace == false || _Canplace == false)
                                canPlace = false;
                            if (canPlace)
                            {
                                boxOver.Add(new Tuple<TextBox, int>(box, leftover));
                            }
                        }
                    }
                }

                List<Tuple<TextBox, int>> s1 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s2 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s3 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s4 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s5 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s6 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s7 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s8 = new List<Tuple<TextBox, int>>();
                List<Tuple<TextBox, int>> s9 = new List<Tuple<TextBox, int>>();
                foreach (Tuple<TextBox, int> tuple in boxOver)
                {
                    if (tuple.Item2 == 1)
                    {
                        s1.Add(tuple);
                    }
                    if (tuple.Item2 == 2)
                        s2.Add(tuple);
                    if (tuple.Item2 == 3)
                        s3.Add(tuple);
                    if (tuple.Item2 == 4)
                        s4.Add(tuple);
                    if (tuple.Item2 == 5)
                        s5.Add(tuple);
                    if (tuple.Item2 == 6)
                        s6.Add(tuple);
                    if (tuple.Item2 == 7)
                        s7.Add(tuple);
                    if (tuple.Item2 == 8)
                        s8.Add(tuple);
                    if (tuple.Item2 == 9)
                        s9.Add(tuple);
                }
                List<List<Tuple<TextBox, int>>> tupList = new List<List<Tuple<TextBox, int>>>();
                tupList.Add(s1);
                tupList.Add(s2);
                tupList.Add(s3);
                tupList.Add(s4);
                tupList.Add(s5);
                tupList.Add(s6);
                tupList.Add(s7);
                tupList.Add(s8);
                tupList.Add(s9);

                foreach (List<Tuple<TextBox, int>> tups in tupList)
                {
                    poss.Add(tups);
                    if (tups.Count == 1)
                    {
                        tups[0].Item1.Text = tups[0].Item2.ToString();
                        foundAnswer = true;
                    }
                }
            }

            if (foundAnswer == false)
            {
                if(resetAfter)
                {
                    foreach(Tuple<TextBox, string> tup in save.Boxes)
                    {
                        tup.Item1.Text = tup.Item2;
                    }
                }
                save = CreateSaveState();
                bool found = false;
                foreach (List<TextBox> lbox in verticals)
                {

                    foreach (TextBox box in lbox)
                    {

                        if (box.Text == "" && found == false)
                        {

                            bool canAnswer = true;
                            for (int i = 1; i <= 9 && found == false; i++)
                            {
                                canAnswer = true;
                                bool keepChecking = true;
                                foreach (Tuple<TextBox, int> tup in guesses)
                                {
                                    if (tup.Item1.Name == box.Name)
                                    {
                                        if (i == tup.Item2)
                                        {
                                            canAnswer = false;
                                        }
                                    }
                                }
                                if (canAnswer)
                                {
                                    foreach (List<Tuple<TextBox, int>> tups in poss)
                                    {
                                        if (keepChecking)
                                        {
                                            foreach (Tuple<TextBox, int> tup in tups)
                                            {

                                                if (tup.Item1.Name == box.Name)
                                                {
                                                    if (i != tup.Item2)
                                                    {
                                                        canAnswer = false;
                                                    }
                                                    else
                                                    {
                                                        canAnswer = true;
                                                        keepChecking = false;
                                                    }

                                                }
                                            }
                                        }
                                    }
                                }

                                if (canAnswer)
                                {

                                    box.Text = i.ToString();
                                    resetAfter = true;
                                    guesses.Add(new Tuple<TextBox, int>(box, i));
                                    found = true;

                                }
                            }
                        }
                    }
                }
            }
        }
コード例 #2
0
ファイル: Form1.cs プロジェクト: Formadill/Sudoku-Solver
        private SaveState CreateSaveState()
        {
            SaveState savestate = new SaveState();
            savestate.Boxes = new List<Tuple<TextBox, string>>();
            foreach(List<TextBox> list1 in verticals)
            {
                foreach (TextBox box in list1)
                {

                    savestate.Boxes.Add(new Tuple<TextBox, string>(box, box.Text));
                }
            }
            return savestate;
        }