zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    

      

  • 相关阅读:
    Javascript FP-ramdajs
    微信小程序开发
    SPA for HTML5
    One Liners to Impress Your Friends
    Sass (Syntactically Awesome StyleSheets)
    iOS App Icon Template 5.0
    React Native Life Cycle and Communication
    Meteor framework
    RESTful Mongodb
    Server-sent Events
  • 原文地址:https://www.cnblogs.com/Jacck/p/8182399.html
Copyright © 2011-2022 走看看