java数独为什么它没有显示数独的最终结果
晚上好,我尝试创建一个应用程序,生成一个初始数独,并尝试使用*算法完成它,在执行时,它显示初始状态,但当它开始求解时,程序关闭而不显示结果,为什么 更新说明: 我创建了最初的数独游戏,从中,我必须使用LinkedList和Astar算法得出最终的解决方案,这里使用的启发式是最小剩余值。我希望我解释了这个问题 =============================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
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,我已经尽力了,我被卡住了,我不能再往前走了。它在关闭时是否会抛出任何错误?我将尝试在解决难题时再往前走,谢谢你帮助显示框架