Java生成數獨函數


突然想寫一下生成算法。代碼注釋的比較多,應該比較好理解

使用了遞歸

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;
    }
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM