数独优化

lzhphantom 发布于 2017/10/23 16:38
阅读 73
收藏 0

数独优化

问题已用红色字体表示,请大神帮小弟解答一下

package idea;

import java.util.ArrayList;

public class Sodukus2 {
    private int[] special = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    private ArrayList<Integer> listTest = new ArrayList<Integer>();
    //检查列是否有重复元素
    private boolean isExistList(int number, int[][] arr, int list) {
        ArrayList<Integer> listarr = new ArrayList<Integer>();
        for (int j = 0; j < arr[list].length; j++) {
            if (arr[j][list] == number) {
                listarr.add(arr[j][list]);
            }
        }
        if (listarr.size() > 1) {
            return true;
        }

        return false;
    }

    private void getArrayList() {
        listTest.clear();
        for (int i = 0; i < special.length; i++) {
            listTest.add(special[i]);
        }

    }
    //检查9格是否有重复
    private boolean isExistNine(int number, int row, int col, int[][] arr) {
        ArrayList<Integer> listarr = new ArrayList<Integer>();
        int NineRow = row / 3 * 3;
        int NineCol = col / 3 * 3;

        for (int i = NineRow; i <= NineRow + 2; i++) {
            for (int m = NineCol; m <= NineCol + 2; m++) {
                if (arr[i][m] == number) {
                    listarr.add(arr[i][m]);
                }
            }
        }
        if (listarr.size() > 1) {
            return true;
        }

        return false;
    }

    public int[][] getNumber(int[][] arr) {
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            getArrayList();//重新获取一组元素
            
            for (int j = 0; j < arr[i].length; j++) {
                int index = (int) (Math.random() * listTest.size());
                arr[i][j] = (Integer) listTest.get(index);//随机获取
                
                if (i > 0) {
                    while (isExistList(arr[i][j], arr, j)
                            || isExistNine(arr[i][j], i, j, arr)) {
                        count++;//排斥最后一个值与其他无限重复
                        if (count > 8) {
                            count = 0;
                            j = 0;
                            getArrayList();
                        }
                        index = (int) (Math.random() * listTest.size());
                        arr[i][j] = (Integer) listTest.get(index);
                    }

                }
                
                listTest.remove(index);//删除该元素
            }
        }
        //问题所在:加上这个换行,结果会很快出来,没有加,就不会出来,请大神解答
        System.out.println();
        return arr;
    }

    public void print(int[][] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        Sodukus2 sd = new Sodukus2();
        int[][] arr = new int[9][9];
        arr = sd.getNumber(arr);
        sd.print(arr);
    }
}
 

加载中
0
flyingsam
flyingsam

我没加也能出来

0
flyingsam
flyingsam

引用来自“flyingsam”的评论

我没加也能出来

跟注释行没关系,重复运行几次发现也会没打印出来,是有地方死循环了

0
flyingsam
flyingsam
                        if (count > 8) {
                            count = 0;
                            j = 0;
                            getArrayList();
                        }

这里面少了一段逻辑 

                            for (int k = 0; k < arr[i].length; k++) {
                                arr[i][k] = 0;
                            }
 

返回顶部
顶部