Java:你运行这个程序怎么样?
Java: how do you run this program?
我是编程新手,正在尝试自学。
我在网上找到了这个数独求解算法,但我似乎无法 运行 - 我想我必须创建一个 main 方法,但我不知道在其中放入什么参数以及如何调用其他方法。
有人可以举例说明我可以做什么吗?谢谢! :)
public class Sudoku {
private static int mBoard[][];
private static int mBoardSize = 9;
private static int mBoxSize = 3;
private boolean mRowSubset[][];
private boolean mColSubset[][];
private boolean mBoxSubset[][];
public Sudoku(int board[][]) {
mBoard = board;
mBoardSize = mBoard.length;
mBoxSize = (int) Math.sqrt(mBoardSize);
}
public void initSubsets() {
mRowSubset = new boolean[mBoardSize][mBoardSize];
mColSubset = new boolean[mBoardSize][mBoardSize];
mBoxSubset = new boolean[mBoardSize][mBoardSize];
for (int i = 0; i < mBoard.length; i++) {
for (int j = 0; j < mBoard.length; j++) {
int value = mBoard[i][j];
if (value != 0) {
setSubsetValue(i, j, value, true);
}
}
}
}
private void setSubsetValue(int i, int j, int value, boolean present) {
mRowSubset[i][value - 1] = present;
mColSubset[j][value - 1] = present;
mBoxSubset[computeBoxNo(i, j)][value - 1] = present;
}
public boolean solve() {
return solve(0, 0);
}
public boolean solve(int i, int j) {
if (i == mBoardSize) {
i = 0;
if (++j == mBoardSize) {
return true;
}
}
if (mBoard[i][j] != 0) {
return solve(i + 1, j);
}
for (int value = 1; value <= mBoardSize; value++) {
if (isValid(i, j, value)) {
mBoard[i][j] = value;
setSubsetValue(i, j, value, true);
if (solve(i + 1, j)) {
return true;
}
setSubsetValue(i, j, value, false);
}
}
mBoard[i][j] = 0;
return false;
}
private boolean isValid(int i, int j, int val) {
val--;
boolean isPresent = mRowSubset[i][val] || mColSubset[j][val] || mBoxSubset[computeBoxNo(i, j)][val];
return !isPresent;
}
private int computeBoxNo(int i, int j) {
int boxRow = i / mBoxSize;
int boxCol = j / mBoxSize;
return boxRow * mBoxSize + boxCol;
}
public void print() {
for (int i = 0; i < mBoardSize; i++) {
if (i % mBoxSize == 0) {
System.out.println(" -----------------------");
}
for (int j = 0; j < mBoardSize; j++) {
if (j % mBoxSize == 0) {
System.out.print("| ");
}
System.out.print(mBoard[i][j] != 0 ? ((Object) (Integer.valueOf(mBoard[i][j]))) : " ");
System.out.print(' ');
}
System.out.println("|");
}
System.out.println(" -----------------------");
}
public static void main(String[] args) {
Sudoku sudoku = new Sudoku(mBoard);
}
}
您可以尝试类似的操作(您应该更改值、大小?):
public static void main(String[] args)
{
//list of rows, where each row has 4 values
int[][] board = new int[][] { {2,3,1,1}, {1,2,1,1},{2,3,3,3}, {4,2,3,3}};
Sudoku sudoku = new Sudoku(board);
sudoku.solve();
sudoku.print();
}
我是编程新手,正在尝试自学。
我在网上找到了这个数独求解算法,但我似乎无法 运行 - 我想我必须创建一个 main 方法,但我不知道在其中放入什么参数以及如何调用其他方法。
有人可以举例说明我可以做什么吗?谢谢! :)
public class Sudoku {
private static int mBoard[][];
private static int mBoardSize = 9;
private static int mBoxSize = 3;
private boolean mRowSubset[][];
private boolean mColSubset[][];
private boolean mBoxSubset[][];
public Sudoku(int board[][]) {
mBoard = board;
mBoardSize = mBoard.length;
mBoxSize = (int) Math.sqrt(mBoardSize);
}
public void initSubsets() {
mRowSubset = new boolean[mBoardSize][mBoardSize];
mColSubset = new boolean[mBoardSize][mBoardSize];
mBoxSubset = new boolean[mBoardSize][mBoardSize];
for (int i = 0; i < mBoard.length; i++) {
for (int j = 0; j < mBoard.length; j++) {
int value = mBoard[i][j];
if (value != 0) {
setSubsetValue(i, j, value, true);
}
}
}
}
private void setSubsetValue(int i, int j, int value, boolean present) {
mRowSubset[i][value - 1] = present;
mColSubset[j][value - 1] = present;
mBoxSubset[computeBoxNo(i, j)][value - 1] = present;
}
public boolean solve() {
return solve(0, 0);
}
public boolean solve(int i, int j) {
if (i == mBoardSize) {
i = 0;
if (++j == mBoardSize) {
return true;
}
}
if (mBoard[i][j] != 0) {
return solve(i + 1, j);
}
for (int value = 1; value <= mBoardSize; value++) {
if (isValid(i, j, value)) {
mBoard[i][j] = value;
setSubsetValue(i, j, value, true);
if (solve(i + 1, j)) {
return true;
}
setSubsetValue(i, j, value, false);
}
}
mBoard[i][j] = 0;
return false;
}
private boolean isValid(int i, int j, int val) {
val--;
boolean isPresent = mRowSubset[i][val] || mColSubset[j][val] || mBoxSubset[computeBoxNo(i, j)][val];
return !isPresent;
}
private int computeBoxNo(int i, int j) {
int boxRow = i / mBoxSize;
int boxCol = j / mBoxSize;
return boxRow * mBoxSize + boxCol;
}
public void print() {
for (int i = 0; i < mBoardSize; i++) {
if (i % mBoxSize == 0) {
System.out.println(" -----------------------");
}
for (int j = 0; j < mBoardSize; j++) {
if (j % mBoxSize == 0) {
System.out.print("| ");
}
System.out.print(mBoard[i][j] != 0 ? ((Object) (Integer.valueOf(mBoard[i][j]))) : " ");
System.out.print(' ');
}
System.out.println("|");
}
System.out.println(" -----------------------");
}
public static void main(String[] args) {
Sudoku sudoku = new Sudoku(mBoard);
}
}
您可以尝试类似的操作(您应该更改值、大小?):
public static void main(String[] args)
{
//list of rows, where each row has 4 values
int[][] board = new int[][] { {2,3,1,1}, {1,2,1,1},{2,3,3,3}, {4,2,3,3}};
Sudoku sudoku = new Sudoku(board);
sudoku.solve();
sudoku.print();
}