方法在 Java 中没有 return 辅助变量
method doesn't return auxiliary variable in Java
我正在尝试编写一种方法来检查数独谜题是否有唯一解,如果为真,则 return 带有空格的谜题可以解决它。
这是生成它的 class:
public class Sudoku {
private SudokuGen sudoku;
private boolean isUnique;
public Sudoku(){
this.isUnique = false;
while (!this.isUnique){
this.setSudoku(createUniqueSolution());
}
this.sudoku.getMyboard().showSudokuMatrix();
}
private SudokuGen createUniqueSolution(){
SudokuGen auxSudoku = new SudokuGen();
this.setSudoku(auxSudoku);
this.sudoku.getMyboard().showSudokuMatrix();
Position availableMove = auxSudoku.getFirstAvailableMove();
while (availableMove != null){
int row,col;
row = availableMove.getX();
col = availableMove.getY();
Integer value = auxSudoku.getValidvalue(row, col, 0);
auxSudoku.makeMove(row, col, value);
auxSudoku.loadValidvalues();
availableMove = auxSudoku.getFirstAvailableMove();
}
if (auxSudoku.getSolved()){
System.out.println("Unique solution");
this.isUnique = true;
return this.getSudoku();
}
else{
System.out.println("Solution is not unique");
return null;
}
}
public void setSudoku(SudokuGen sudoku){
this.sudoku = sudoku;
}
public SudokuGen getSudoku(){
return (this.sudoku);
}
}
SudokuGen return 是一个生成的谜题,我不知道解法是否唯一。所以我调用 createUniqueSolution 来检查它。
首先它创建 auxSudoku 并保存它,然后它开始使用 auxSudoku 拼图检查解决方案是否唯一。
- availableMove: 获取第一个有 1 个候选的单元格,如果没有候选它 returns null.
- 值:取给定单元格的候选项。
- .makeMove: 播放候选人,然后我使用它后更新候选人。
然后我让下一个候选人再次调用 availableMove,直到它为 null。
所以简而言之,我的问题是如果我使用辅助变量,为什么会修改this.sudoku。提前谢谢你。
这是代码的输出:
212 238 0 0 175 372 311 0 103
0 0 0 238 0 103 312 372 0
0 372 0 0 212 0 238 175 0
0 312 0 0 372 311 212 10 0
372 0 10 0 238 0 103 312 0
0 212 0 0 0 0 372 311 0
311 0 0 372 10 175 0 0 312
312 0 238 311 0 212 175 0 0
24 0 372 312 0 0 10 0 0
Solution is not unique
0 100 49 71 185 0 0 262 178
0 71 262 0 300 49 0 100 257
0 0 177 100 262 0 71 0 0
0 185 300 262 71 100 178 0 0
0 0 0 177 49 0 0 0 0
0 0 178 300 257 185 0 71 0
0 262 0 185 0 300 0 178 0
0 177 0 0 178 71 0 185 0
71 0 185 0 0 0 49 0 300
Solution is not unique
284 0 0 0 0 193 25 179 0
32 25 193 179 284 0 0 0 0
0 0 0 92 25 0 296 0 284
0 32 296 0 0 0 0 0 179
193 0 0 0 92 0 32 296 84
0 179 284 0 296 371 193 0 92
0 284 32 0 371 0 0 92 0
296 92 371 25 179 0 0 0 193
179 0 84 296 0 0 371 0 0
唯一解
284 296 92 371 84 193 25 179 32
32 25 193 179 284 296 92 84 371
371 84 179 92 25 32 296 193 284
92 32 296 84 193 25 284 371 179
193 371 25 284 92 179 32 296 84
84 179 284 32 296 371 193 25 92
25 284 32 193 371 84 179 92 296
296 92 371 25 179 284 84 32 193
179 193 84 296 32 92 371 284 25
最后的输出由构造函数打印。
已更新class
public class Sudoku {
private SudokuGen sudoku;
public Sudoku(){
SudokuGen auxSudoku = new SudokuGen();
while (!createUniqueSolution(auxSudoku)){
auxSudoku = new SudokuGen();
}
this.sudoku.getMyboard().showSudokuMatrix();
}
private boolean createUniqueSolution(SudokuGen sudoku){
this.sudoku = new SudokuGen(sudoku);
this.sudoku.getMyboard().showSudokuMatrix();
Position availableMove = sudoku.getFirstAvailableMove();
while (availableMove != null){
int row,col;
row = availableMove.getX();
col = availableMove.getY();
Integer value = sudoku.getValidvalue(row, col, 0);
sudoku.makeMove(row, col, value);
sudoku.loadValidvalues();
availableMove = sudoku.getFirstAvailableMove();
}
if (sudoku.getSolved()){
System.out.println("Unique solution");
return true;
}
else{
System.out.println("Solution is not unique");
return false;
}
}
public void setSudoku(SudokuGen sudoku){
this.sudoku = sudoku;
}
public SudokuGen getSudoku(){
return (this.sudoku);
}
}
以及数独生成器的复制构造函数:
public SudokuGen(SudokuGen sudoku){
this.genboard = sudoku.genboard;
this.lockedCells = sudoku.lockedCells;
this.mutableCells = sudoku.mutableCells;
this.mutable = sudoku.mutable;
this.myboard = sudoku.myboard;
this.Solved = sudoku.Solved;
this.validvalues = sudoku.validvalues;
}
setSudoku() 方法不会创建 SudokuGen 对象的副本,而是将现有对象附加到父对象。
你想要的是为 class SudokuGen 创建一个复制构造函数,这样你就可以将行 this.sudoku = sudoku;
更改为 this.sudoku = new SudokuGen (sudoku);
我正在尝试编写一种方法来检查数独谜题是否有唯一解,如果为真,则 return 带有空格的谜题可以解决它。
这是生成它的 class:
public class Sudoku {
private SudokuGen sudoku;
private boolean isUnique;
public Sudoku(){
this.isUnique = false;
while (!this.isUnique){
this.setSudoku(createUniqueSolution());
}
this.sudoku.getMyboard().showSudokuMatrix();
}
private SudokuGen createUniqueSolution(){
SudokuGen auxSudoku = new SudokuGen();
this.setSudoku(auxSudoku);
this.sudoku.getMyboard().showSudokuMatrix();
Position availableMove = auxSudoku.getFirstAvailableMove();
while (availableMove != null){
int row,col;
row = availableMove.getX();
col = availableMove.getY();
Integer value = auxSudoku.getValidvalue(row, col, 0);
auxSudoku.makeMove(row, col, value);
auxSudoku.loadValidvalues();
availableMove = auxSudoku.getFirstAvailableMove();
}
if (auxSudoku.getSolved()){
System.out.println("Unique solution");
this.isUnique = true;
return this.getSudoku();
}
else{
System.out.println("Solution is not unique");
return null;
}
}
public void setSudoku(SudokuGen sudoku){
this.sudoku = sudoku;
}
public SudokuGen getSudoku(){
return (this.sudoku);
}
}
SudokuGen return 是一个生成的谜题,我不知道解法是否唯一。所以我调用 createUniqueSolution 来检查它。
首先它创建 auxSudoku 并保存它,然后它开始使用 auxSudoku 拼图检查解决方案是否唯一。
- availableMove: 获取第一个有 1 个候选的单元格,如果没有候选它 returns null.
- 值:取给定单元格的候选项。
- .makeMove: 播放候选人,然后我使用它后更新候选人。
然后我让下一个候选人再次调用 availableMove,直到它为 null。
所以简而言之,我的问题是如果我使用辅助变量,为什么会修改this.sudoku。提前谢谢你。
这是代码的输出:
212 238 0 0 175 372 311 0 103
0 0 0 238 0 103 312 372 0
0 372 0 0 212 0 238 175 0
0 312 0 0 372 311 212 10 0
372 0 10 0 238 0 103 312 0
0 212 0 0 0 0 372 311 0
311 0 0 372 10 175 0 0 312
312 0 238 311 0 212 175 0 0
24 0 372 312 0 0 10 0 0
Solution is not unique
0 100 49 71 185 0 0 262 178
0 71 262 0 300 49 0 100 257
0 0 177 100 262 0 71 0 0
0 185 300 262 71 100 178 0 0
0 0 0 177 49 0 0 0 0
0 0 178 300 257 185 0 71 0
0 262 0 185 0 300 0 178 0
0 177 0 0 178 71 0 185 0
71 0 185 0 0 0 49 0 300
Solution is not unique
284 0 0 0 0 193 25 179 0
32 25 193 179 284 0 0 0 0
0 0 0 92 25 0 296 0 284
0 32 296 0 0 0 0 0 179
193 0 0 0 92 0 32 296 84
0 179 284 0 296 371 193 0 92
0 284 32 0 371 0 0 92 0
296 92 371 25 179 0 0 0 193
179 0 84 296 0 0 371 0 0
唯一解
284 296 92 371 84 193 25 179 32
32 25 193 179 284 296 92 84 371
371 84 179 92 25 32 296 193 284
92 32 296 84 193 25 284 371 179
193 371 25 284 92 179 32 296 84
84 179 284 32 296 371 193 25 92
25 284 32 193 371 84 179 92 296
296 92 371 25 179 284 84 32 193
179 193 84 296 32 92 371 284 25
最后的输出由构造函数打印。
已更新class
public class Sudoku {
private SudokuGen sudoku;
public Sudoku(){
SudokuGen auxSudoku = new SudokuGen();
while (!createUniqueSolution(auxSudoku)){
auxSudoku = new SudokuGen();
}
this.sudoku.getMyboard().showSudokuMatrix();
}
private boolean createUniqueSolution(SudokuGen sudoku){
this.sudoku = new SudokuGen(sudoku);
this.sudoku.getMyboard().showSudokuMatrix();
Position availableMove = sudoku.getFirstAvailableMove();
while (availableMove != null){
int row,col;
row = availableMove.getX();
col = availableMove.getY();
Integer value = sudoku.getValidvalue(row, col, 0);
sudoku.makeMove(row, col, value);
sudoku.loadValidvalues();
availableMove = sudoku.getFirstAvailableMove();
}
if (sudoku.getSolved()){
System.out.println("Unique solution");
return true;
}
else{
System.out.println("Solution is not unique");
return false;
}
}
public void setSudoku(SudokuGen sudoku){
this.sudoku = sudoku;
}
public SudokuGen getSudoku(){
return (this.sudoku);
}
}
以及数独生成器的复制构造函数:
public SudokuGen(SudokuGen sudoku){
this.genboard = sudoku.genboard;
this.lockedCells = sudoku.lockedCells;
this.mutableCells = sudoku.mutableCells;
this.mutable = sudoku.mutable;
this.myboard = sudoku.myboard;
this.Solved = sudoku.Solved;
this.validvalues = sudoku.validvalues;
}
setSudoku() 方法不会创建 SudokuGen 对象的副本,而是将现有对象附加到父对象。
你想要的是为 class SudokuGen 创建一个复制构造函数,这样你就可以将行 this.sudoku = sudoku;
更改为 this.sudoku = new SudokuGen (sudoku);