突然想寫一下生成算法。代碼注釋的比較多,應該比較好理解
使用了遞歸
import java.util.ArrayList;
public class Sudoku {
static int sudokuBoard[][] = new int[9][9];
public static void main(String[] args){
generateMatrix(0);
}
//獲取某點可用數列
static ArrayList<Integer> getVaildValueList(int x, int y){
ArrayList<Integer> vaildList = new ArrayList<>();
for(int i =1; i < 10;i++){
vaildList.add(i);
}
//x,y軸去重復
for(int i = 0;i < 9;i++){
Integer invaildNum1 = sudokuBoard[x][i];
Integer invaildNum2 = sudokuBoard[i][y];
if(invaildNum1 != 0 && vaildList.contains(invaildNum1)){
vaildList.remove(invaildNum1);
}
if(invaildNum2 != 0 && vaildList.contains(invaildNum2)){
vaildList.remove(invaildNum2);
}
}
//九小格去重復
for(int i = (x/3)*3; i<(x/3)*3+3; i++){
for(int j = (y/3)*3; j<(y/3)*3+3; j++){
Integer invaildNum = sudokuBoard[i][j];
if(invaildNum != 0 && vaildList.contains(invaildNum)){
vaildList.remove(invaildNum);
}
}
}
return vaildList;
}
//生成數獨函數,便於傳參使用,pos參數使用單個int代替
static boolean generateMatrix(int pos){
//pos對應的x,y
int x = pos/9;
int y = pos%9;
//生成本節點可用使用的值列表
ArrayList<Integer> validList = getVaildValueList(x, y);
//如果沒有可用值返回false
if (validList.isEmpty()) {
return false;
}
//有值可以用,遍歷值
for(int i =0; i < validList.size();i++){
sudokuBoard[x][y] = validList.get(i);
//如果此次賦值已經賦值到了最后一位,則輸出整個數獨。本應該這里是return true的地方,但是那樣如果需要更多的結果就顯示不出來了。
if(pos == 80){
for(int m = 0; m< sudokuBoard.length;m++){
for(int n = 0; n <sudokuBoard[m].length;n++){
System.out.print(sudokuBoard[m][n]);
}
System.out.println();
}
System.out.println("--------------------------");
sudokuBoard[x][y] = 0;
return false;
}
if(generateMatrix(pos+1) == true){ //遞歸在這
return true;
}
if(i == validList.size()-1) {
sudokuBoard[x][y] = 0;
return false;
}
}
return true;
}
}