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

  

转载于:https://www.cnblogs.com/Jacck/p/8182399.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值