java数独为什么它没有显示数独的最终结果

java数独为什么它没有显示数独的最终结果,java,list,tree,a-star,sudoku,Java,List,Tree,A Star,Sudoku,晚上好,我尝试创建一个应用程序,生成一个初始数独,并尝试使用*算法完成它,在执行时,它显示初始状态,但当它开始求解时,程序关闭而不显示结果,为什么 更新说明: 我创建了最初的数独游戏,从中,我必须使用LinkedList和Astar算法得出最终的解决方案,这里使用的启发式是最小剩余值。我希望我解释了这个问题 ============================= package sudoku; import java.util.Collections; import java.util.I

晚上好,我尝试创建一个应用程序,生成一个初始数独,并尝试使用*算法完成它,在执行时,它显示初始状态,但当它开始求解时,程序关闭而不显示结果,为什么

更新说明: 我创建了最初的数独游戏,从中,我必须使用LinkedList和Astar算法得出最终的解决方案,这里使用的启发式是最小剩余值。我希望我解释了这个问题

=============================

package sudoku;

import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Random;
import javax.swing.*;


public class Sudoku extends JFrame implements Comparable<Object>
{
/**
 * 
 */
private static final long serialVersionUID = 1L;
private int idp;
private int id;
private int[][] sudoku;
private int astar;
private LinkedList <Sudoku> sons ;
private boolean isFinished;
private boolean isValid;

public Sudoku()
{
    isValid = false;
    isFinished = false;
    idp = 0;
    id = 0;
    sudoku = new int[9][9];
    astar = 0;
    sons = new LinkedList<Sudoku>();
    init();
}

public Sudoku(int id,int[][] s)
{
    isValid = false;
    isFinished = false;
    idp = id;
    id = id+1;
    sudoku = s;
    astar = astar();
    sons = new LinkedList<Sudoku>();
}

public void init()
{
    int diff = 31;
    Random r = new Random();
    while(diff>0)
    {
        int x = r.nextInt(9);
        int y = r.nextInt(9);
        sudoku[x][y] = 1+ r.nextInt(9);
        astar += sudoku[x][y];
        diff--;
    }
    astar = 405 - astar;
}

public int astar()
{
    int res=0;
    for(int i=0;i<9;i++)
    {
        for(int j=0;j<9;j++)
        {
            res += sudoku[i][j];
        }
    }
    res = 405-res;
    return res;
}

public void checkFinish()
{
    for(int i=0;i<9;i++)
    {
        for(int j=0;j<9;j++)
        {
            if(sudoku[i][j]!=0)
            {
                isFinished = true;
            }
            else
            {
                isFinished = false;
                return;
            }
        }
    }
}

public boolean isValidSudoku(int[][] sudoku) 
{
    if(isFinished)
    {
        if (sudoku == null || sudoku.length != 9 || sudoku[0].length != 9)
            return false;
        // check each column
        for (int i = 0; i < 9; i++) 
        {
            boolean[] m = new boolean[9];
            for (int j = 0; j < 9; j++) 
            {
                if (sudoku[i][j] != 0) 
                {
                    if (m[ (sudoku[i][j] - 1)]) 
                    {
                        return false;
                    }
                    m[ (sudoku[i][j] - 1)] = true;
                }
            }
        }

        //check each row
        for (int j = 0; j < 9; j++) 
        {
            boolean[] m = new boolean[9];
            for (int i = 0; i < 9; i++) 
            {
                if (sudoku[i][j] != 0) 
                {
                    if (m[ (sudoku[i][j] - 1)]) 
                    {
                        return false;
                    }
                    m[ (sudoku[i][j] - 1)] = true;
                }
            }
        }

        //check each 3*3 matrix
        for (int block = 0; block < 9; block++) 
        {
            boolean[] m = new boolean[9];
            for (int i = block / 3 * 3; i < block / 3 * 3 + 3; i++) 
            {
                for (int j = block % 3 * 3; j < block % 3 * 3 + 3; j++) 
                {
                    if (sudoku[i][j] != 0) 
                    {
                        if (m[(int) (sudoku[i][j] - 1)]) 
                        {
                            return false;
                        }
                        m[(int) (sudoku[i][j] - 1)] = true;
                    }
                }
            }
        }
        return true;
    }
    else
    {
        System.out.println("not finished yet");
    }
    return false;
}

public void checkSolution()
{
    if(isValidSudoku(sudoku))
    {
        isValid = true;
    }
    else
    {
        isValid = false;
    }
}

public void viewSolution()
{
    checkSolution();
    if(isValid)
    {
        JFrame frame = new JFrame("Sudoku");
        JTextField[][] s = new JTextField[9][9];
        frame.setVisible(true);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        for(int i =0;i<9;i++)
        {
            for(int j =0;j<9;j++)
            {
                s[i][j].setText(String.valueOf(sudoku[i][j]));
                s[i][j].setVisible(true);
                s[i][j].setSize(50, 50);
                s[i][j].setLocation(50*i, 50*j);
                frame.add(s[i][j]);
            }
        }
    }
}

public void show()
{
    for(int i =0;i<9;i++)
    {
        for(int j =0;j<9;j++)
        {
            System.out.print(sudoku[i][j]+" ");
        }
        System.out.println("");
    }
}

public void solve(Sudoku sudoku)
{   
        for(int i  = 0;i<9;i++)
        {
            for(int j = 0;j<9;j++)
            {
                int[][] ts = sudoku.getSudoku();
                if(ts[i][j]==0)
                {
                    for(int k=0;k<9;k++)
                    {
                        ts[i][j] = k+1;
                        Sudoku t = new Sudoku(id,ts);
                        sons.add(t);
                    }
                }
            }
        }

        Iterator<Sudoku> iter = sons.iterator();
        Collections.sort(sons);
        while(iter.hasNext() && iter.next().getAstar()>0)
        {
            Sudoku temp = iter.next();
            temp.solve(temp);
        }

        checkFinish();
        if(sudoku.isFinished)
        {
            viewSolution();
        }
}

public int getIdp() 
{
    return idp;
}

public int getId() 
{
    return id;
}

public int[][] getSudoku() 
{
    return sudoku;
}

public int getAstar() 
{
    return astar;
}

public LinkedList<Sudoku> getSons() 
{
    return sons;
}

public int compareTo(Object other) 
{
    Sudoku temp = (Sudoku)other;
    if (this.astar < temp.astar)
        return 1;
    else if (this.astar > temp.astar)
        return -1;
    else
        return 0; 
}
}
package sudoku;

public class Main 
{

public static void main(String[] args) 
{
    Sudoku s = new Sudoku();
    s.show();
    s.solve(s);
}

}
控制台预览:

0 0 0 6 0 0 0 0 0

30009707

0 0 5 1 0 6 0 0 0 0

0 0 7 3 0 6 7

8000800

05900629

0 0 0 9 5 1 8 0

0 0 0 0 1 0 0 0 0

0 0 7 0 9 0 7 0

=============================

package sudoku;

import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Random;
import javax.swing.*;


public class Sudoku extends JFrame implements Comparable<Object>
{
/**
 * 
 */
private static final long serialVersionUID = 1L;
private int idp;
private int id;
private int[][] sudoku;
private int astar;
private LinkedList <Sudoku> sons ;
private boolean isFinished;
private boolean isValid;

public Sudoku()
{
    isValid = false;
    isFinished = false;
    idp = 0;
    id = 0;
    sudoku = new int[9][9];
    astar = 0;
    sons = new LinkedList<Sudoku>();
    init();
}

public Sudoku(int id,int[][] s)
{
    isValid = false;
    isFinished = false;
    idp = id;
    id = id+1;
    sudoku = s;
    astar = astar();
    sons = new LinkedList<Sudoku>();
}

public void init()
{
    int diff = 31;
    Random r = new Random();
    while(diff>0)
    {
        int x = r.nextInt(9);
        int y = r.nextInt(9);
        sudoku[x][y] = 1+ r.nextInt(9);
        astar += sudoku[x][y];
        diff--;
    }
    astar = 405 - astar;
}

public int astar()
{
    int res=0;
    for(int i=0;i<9;i++)
    {
        for(int j=0;j<9;j++)
        {
            res += sudoku[i][j];
        }
    }
    res = 405-res;
    return res;
}

public void checkFinish()
{
    for(int i=0;i<9;i++)
    {
        for(int j=0;j<9;j++)
        {
            if(sudoku[i][j]!=0)
            {
                isFinished = true;
            }
            else
            {
                isFinished = false;
                return;
            }
        }
    }
}

public boolean isValidSudoku(int[][] sudoku) 
{
    if(isFinished)
    {
        if (sudoku == null || sudoku.length != 9 || sudoku[0].length != 9)
            return false;
        // check each column
        for (int i = 0; i < 9; i++) 
        {
            boolean[] m = new boolean[9];
            for (int j = 0; j < 9; j++) 
            {
                if (sudoku[i][j] != 0) 
                {
                    if (m[ (sudoku[i][j] - 1)]) 
                    {
                        return false;
                    }
                    m[ (sudoku[i][j] - 1)] = true;
                }
            }
        }

        //check each row
        for (int j = 0; j < 9; j++) 
        {
            boolean[] m = new boolean[9];
            for (int i = 0; i < 9; i++) 
            {
                if (sudoku[i][j] != 0) 
                {
                    if (m[ (sudoku[i][j] - 1)]) 
                    {
                        return false;
                    }
                    m[ (sudoku[i][j] - 1)] = true;
                }
            }
        }

        //check each 3*3 matrix
        for (int block = 0; block < 9; block++) 
        {
            boolean[] m = new boolean[9];
            for (int i = block / 3 * 3; i < block / 3 * 3 + 3; i++) 
            {
                for (int j = block % 3 * 3; j < block % 3 * 3 + 3; j++) 
                {
                    if (sudoku[i][j] != 0) 
                    {
                        if (m[(int) (sudoku[i][j] - 1)]) 
                        {
                            return false;
                        }
                        m[(int) (sudoku[i][j] - 1)] = true;
                    }
                }
            }
        }
        return true;
    }
    else
    {
        System.out.println("not finished yet");
    }
    return false;
}

public void checkSolution()
{
    if(isValidSudoku(sudoku))
    {
        isValid = true;
    }
    else
    {
        isValid = false;
    }
}

public void viewSolution()
{
    checkSolution();
    if(isValid)
    {
        JFrame frame = new JFrame("Sudoku");
        JTextField[][] s = new JTextField[9][9];
        frame.setVisible(true);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        for(int i =0;i<9;i++)
        {
            for(int j =0;j<9;j++)
            {
                s[i][j].setText(String.valueOf(sudoku[i][j]));
                s[i][j].setVisible(true);
                s[i][j].setSize(50, 50);
                s[i][j].setLocation(50*i, 50*j);
                frame.add(s[i][j]);
            }
        }
    }
}

public void show()
{
    for(int i =0;i<9;i++)
    {
        for(int j =0;j<9;j++)
        {
            System.out.print(sudoku[i][j]+" ");
        }
        System.out.println("");
    }
}

public void solve(Sudoku sudoku)
{   
        for(int i  = 0;i<9;i++)
        {
            for(int j = 0;j<9;j++)
            {
                int[][] ts = sudoku.getSudoku();
                if(ts[i][j]==0)
                {
                    for(int k=0;k<9;k++)
                    {
                        ts[i][j] = k+1;
                        Sudoku t = new Sudoku(id,ts);
                        sons.add(t);
                    }
                }
            }
        }

        Iterator<Sudoku> iter = sons.iterator();
        Collections.sort(sons);
        while(iter.hasNext() && iter.next().getAstar()>0)
        {
            Sudoku temp = iter.next();
            temp.solve(temp);
        }

        checkFinish();
        if(sudoku.isFinished)
        {
            viewSolution();
        }
}

public int getIdp() 
{
    return idp;
}

public int getId() 
{
    return id;
}

public int[][] getSudoku() 
{
    return sudoku;
}

public int getAstar() 
{
    return astar;
}

public LinkedList<Sudoku> getSons() 
{
    return sons;
}

public int compareTo(Object other) 
{
    Sudoku temp = (Sudoku)other;
    if (this.astar < temp.astar)
        return 1;
    else if (this.astar > temp.astar)
        return -1;
    else
        return 0; 
}
}
package sudoku;

public class Main 
{

public static void main(String[] args) 
{
    Sudoku s = new Sudoku();
    s.show();
    s.solve(s);
}

}
您的show()方法正在重写java.awt.Window.show()方法。您需要调用super.show()作为该方法的第一行。所以你的新方法是:

public void show()
{
    super.show();//Call to super class to let it paint the window
    for(int i =0;i<9;i++)
    {
        for(int j =0;j<9;j++)
        {
            System.out.print(sudoku[i][j]+" ");
        }
        System.out.println("");
    }
}

寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建一个最小的、完整的和可验证的示例。我将更新explanation@RobinhoodVanpersie对别人大喊大叫是没有用的help@talex,我已经尽力了,我被卡住了,我不能再往前走了。它在关闭时是否会抛出任何错误?我将尝试在解决难题时再往前走,谢谢你帮助显示框架