⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainform.cs

📁 Sudoku as a CSP: Using algorithms and techniques from CSP to solve an NxN Sudoku puzzle.
💻 CS
📖 第 1 页 / 共 3 页
字号:
            Clear();
            if (grid.Length != gridSize * gridSize) return; 
            for (int i = 0; i < gridSize; i++)
                for (int j = 0; j < gridSize; j++)
                {
                    if (grid[i * gridSize + j] == '.') continue;

                    SetButton(graphicSudokuBoard[i, j], grid[i * gridSize + j]);
                }
        }
        private void GenGridButton_Click(object sender, EventArgs e)
        {
            string grid = "";
            switch (gridSize)   
            {
                case 4:

                    if (level == Level.Easy)
                    {
                        Random r = new Random();
                        int i = r.Next(Easygrid4x4.Length);
                        grid = Easygrid4x4[i];
                        m_currentGrid = i;
                        groupBox1.Text = i.ToString(); 
                    }
                    if (level == Level.Medium)
                    {
                        Random r = new Random();
                        int i = r.Next(Mediumgrid4x4.Length);
                        grid = Mediumgrid4x4[i];
                        m_currentGrid = (30 + i);
                        groupBox1.Text = "Puzzle Number " + (30 + i).ToString(); 
                    }
                    if (level == Level.Hard)
                    {
                        Random r = new Random();
                        int i = r.Next(Hardgrid4x4.Length);
                        grid = Hardgrid4x4[i];
                        m_currentGrid = (60 + i);
                        groupBox1.Text = "Puzzle Number " + (60 + i).ToString(); 
                    }
                    genGrid(grid);
                    
                    break;
                case 9:

                    if (level == Level.Easy) 
                    {
                        Random r = new Random();
                        int i = r.Next(Easygrid9x9.Length);
                        grid = Easygrid9x9[i];
                        m_currentGrid = (90 + i);
                        groupBox1.Text = "Puzzle Number " + (90 + i).ToString(); 
                    }
                    if (level== Level.Medium) 
                    {
                        Random r = new Random();
                        int i = r.Next(Mediumgrid9x9.Length);
                        grid = Mediumgrid9x9[i];
                        m_currentGrid = (120 + i);
                        groupBox1.Text = "Puzzle Number " + (120 + i).ToString(); 
                    }
                    if (level == Level.Hard)
                    {
                        Random r = new Random();
                        int i = r.Next(Hardgrid9x9.Length);
                        grid = Hardgrid9x9[i];
                        m_currentGrid = (150 + i);
                        groupBox1.Text = "Puzzle Number " + (150 + i).ToString(); 
                    }
                    genGrid(grid);
                    break;
                case 16:
                    if (level == Level.Easy)
                    {
                        Random r = new Random();
                        int i = r.Next(Easygrid16x16.Length);
                       grid =Easygrid16x16[i];
                       m_currentGrid = (180 + i);
                       groupBox1.Text = "Puzzle Number " + (180 + i).ToString(); 
                    }
                    if (level== Level.Medium)
                    {
                        Random r = new Random();
                        int i = r.Next(Mediumgrid16x16.Length);
                        grid = Mediumgrid16x16[i];
                        m_currentGrid = (210 + i);
                        groupBox1.Text = "Puzzle Number " + (210 + i).ToString(); 
                    }
                    if (level == Level.Hard) 
                    {
                        Random r = new Random();
                        int i = r.Next(Hardgrid16x16.Length);
                        grid = Hardgrid16x16[i];
                        m_currentGrid = (240 + i);
                        groupBox1.Text = "Puzzle Number " + (240 + i).ToString(); 
                    }
                    genGrid(grid);
                    break;
                case 25:
                    if (level == Level.Easy)
                    {
                        Random r = new Random();
                        int i = r.Next(Easygrid25X25.Length);
                        grid = Easygrid25X25[i];
                        m_currentGrid = (270 + i);
                        groupBox1.Text = "Puzzle Number " + (270 + i).ToString(); 
                    }
                    if (level == Level.Medium) 
                    {
                        Random r = new Random();
                        int i = r.Next(Mediumgrid25x25.Length);
                        grid = Mediumgrid25x25[i];
                        m_currentGrid = (300 + i);
                        groupBox1.Text = "Puzzle Number " + (300 + i).ToString(); 
                    }
                    if (level == Level.Hard) 
                    {
                        Random r = new Random();
                        int i = r.Next(Hardgrid25x25.Length);
                        grid = Hardgrid25x25[i];
                        m_currentGrid = (330 + i);
                        groupBox1.Text = "Puzzle Number " + (330 + i).ToString(); 
                    }
                    genGrid(grid);
                    break; 
                default:
                    break;
            }
                    
        }

        private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
        {
            About ab = new About();
            ab.ShowDialog();  
        }

        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close();
        }
         string GetGridString()
        {
            string result = "";
            for (int i = 0; i < gridSize; i++)
                for (int j = 0; j < gridSize; j++)
                    if (graphicSudokuBoard[i, j].Text.Length > 0)
                        result += graphicSudokuBoard[i, j].Text;
                    else
                        result += '.';

            return result; 
        }
        bool enable = true;
        void SetResult(MyCell[,] result)
        {

            if (result != null)
            {

                for (int i = 0; i < gridSize; i++)
                    for (int j = 0; j < gridSize; j++)
                    {
                        graphicSudokuBoard[i, j].Text = result[i, j].Value;
                        enable = false; 
                    }
            }
            else
            {
                MessageBox.Show("A Conflict Found.  Cannot solve this puzzel.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        delegate string solve_string(string grid);
        delegate MyCell[,] solve(string grid);
        bool[] finished = { false, false, false };

        void FillTimoutCombo()
        {
            TimeSpan duration;
            for (int i = 1; i < 10; i++)
            {
                duration = TimeSpan.FromMilliseconds(100 * i);
                timoutCombo.Items.Add(duration.TotalMilliseconds.ToString() + "ms");
            }
            for (int i = 1; i < 60; i++)
            {
                duration = TimeSpan.FromSeconds( i);
                timoutCombo.Items.Add(duration.TotalSeconds.ToString() + "s");
            }
            for (int i = 1; i < 16; i++)
            {
                duration = TimeSpan.FromMinutes(i);
                timoutCombo.Items.Add(duration.TotalMinutes.ToString() + "min");
            }
            timoutCombo.SelectedItem = "30s"; 
        }
        
         private int timeout=30000;
        GraphData data;
        StartingInfo startinfo;
        MyCell[,] m_currentSolution;
        MySolver cursolver = null;
        void Solve()
        {
            finish = false;
            MySolver solver = new MySolver(gridSize, startinfo);
             m_currentSolution = solver.Solve(GetGridString());
             cursolver = solver;
             finish = true;  
        }
       
        bool finish = false;  
        private void SolveButton_Click(object sender, EventArgs e)
        {
            data = new GraphData();
            for (int k = 0; k < ValList.CheckedItems.Count; k++)
                for (int j = 0; j < VarList.CheckedItems.Count; j++)
                    for (int i = 0; i < ConPropList.CheckedItems.Count; i++)
                    {
                        startinfo=new StartingInfo();
                        if (ConPropList.CheckedItems[i].ToString()!="None.")
                        {
                            startinfo.isFC=true;
                            if (ConPropList.CheckedItems[i].ToString()!="FC")
                            {
                                startinfo.isAC =true;
                            }
                        }
                        if (VarList.CheckedItems[j].ToString() == "Min Remeining Values")
                            startinfo.isMRV=true;
                        else
                            if (VarList.CheckedItems[j].ToString() == "MRV+MD")
                                 startinfo.isMRV_MD=true;

                        if (ValList.CheckedItems[k].ToString() == "Least Constraint Value")
                            startinfo.isLCV=true;
                        ThreadStart ss = new ThreadStart(Solve);
                        Thread thread = new Thread(ss); 
                        LogText.Text += "Starting ConProp : " + ConPropList.CheckedItems[i].ToString() + ". Var Heuristics : " + VarList.CheckedItems[j].ToString() + ". Val Heuristics : " + ValList.CheckedItems[k].ToString() + "...\n";
                        thread.Start();
                        thread.Join(timeout);
                        thread.Abort();
                        if (finish)
                        {
                            LogText.Text += "Finish in " + cursolver.Duration.TotalMilliseconds.ToString() + "ms . Backtracks : " + cursolver.NumOfBacktracking.ToString() + ".\n";
                            LogText.Select(LogText.Text.Length, 0);
                            LogText.ScrollToCaret();
                            data.Add("[ " + (ConPropList.Items.IndexOf(ConPropList.CheckedItems[i]) + 9 * ValList.Items.IndexOf(ValList.CheckedItems[k]) + 3 * VarList.Items.IndexOf(VarList.CheckedItems[j])).ToString() + " ]", cursolver.Duration.TotalMilliseconds, cursolver.NumOfBacktracking);
                        }
                        else
                        {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -