如何从方法中获取递归调用

时间:2015-12-13 19:28:12

标签: java recursion call sudoku

我刚刚写完了一个数独求解器。它有两个类,一个控制台求解器和一个gui求解器。 控制台解算器有一个名为solve的方法,它以递归方式解决了数独。 gui扩展了控制台求解器并使用了它的求解方法。通过在执行另一个递归调用之前打印出方法内部的sudoku字段,可以很容易地跟踪每个递归步骤,如下所示:

System.out.println(field);

// solve next cell
if (j < 8) solve(field, row, column + 1);
else solve(field, row + 1, 0;
}

但是如何在gui中显示字段中的变化呢? 我使用JTable来显示gui中的sudoku字段。 目前我只显示结果,但不显示导致它的步骤,这似乎有点无聊。

这里有一些更相关的代码:

/* solve button action listener/handler */


    solveButton.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent e) {

             /* solve the sudoku and display it 
              * in solve table.
              */
                fieldToTable(field, solveTable); //put sudoku field in display
                try {
                    solve(field, 0, 0); // Solve starting at [0,0]
                } catch (SolvedException d) {
                    /* SOLVED */

                    }

                        } //End of action handler
            }); // End of action listener


    /* Done with solve button action listener */

1 个答案:

答案 0 :(得分:0)

您可以在线程中“解决”它并在每次迭代中更新Board。这是一个使用Thread的基本apporach - 一个更复杂的可能会使用SwingWorker。

免责声明:您可能需要添加其他检查,最后制作一些变量,以此类推。

  solveButton.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent e) {
         /* solve the sudoku and display it in solve table. */
         fieldToTable(field, solveTable); //put sudoku field in display
         //Disable button while solving
         solveButton.setEnabled(false);
         //Start Thread to do the work
         new Thread() {
            public void run() {
              try { 
                 solve(field, 0, 0);
              } catch(SolvedException se) {
                //What now - reenable button                 
                SwingUtilities.invokeLater(() -> solveButton.setEnabled(true));
              }
            }
         }.start();                    
       } //End of action handler
    }); // End of action listener

更改你的solve()以在每次通话时更新电路板:

public void solve(Field field, int x, int y) {
    SwingUtilities.invokeLater(() -> fieldToTable(field, solveTable));

    // YOUR SOLVE LOGIC
}