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

      

  • 相关阅读:
    php原生PHPExcel插件导表(附表格合并,加粗居中及加边框换行操作)
    VMware虚拟机基于contos 7 搭建lnmp环境全过程
    菜鸟学git的基本命令及常见错误
    为什么要写blog????
    JavaScript高级程序设计--函数小记
    jsapi微信支付
    Javascript模式小记(一)
    图片的增删查
    图形的滚动及颜色区域的拉移
    网页中的宽与高
  • 原文地址:https://www.cnblogs.com/Jacck/p/8182399.html
Copyright © 2020-2023  润新知