Java - 从9x9网格中的每个方块中选择一个数字

时间:2017-04-27 23:12:36

标签: java grid-layout sudoku

我有一个9x9的数独网格,我需要从网格中的每个3x3平方得到一个随机数。

最可怕的代码是这样的:

    if(square == 0) {
        row = random.nextInt(3);
        col = random.nextInt(3);
    }

    if(square == 1) {
        row = random.nextInt(3);
        col = random.nextInt(3) + 3;
    }
    if(square == 2) {
        row = random.nextInt(3);
        col = random.nextInt(3) + 6;
    }
    if(square == 3) {
        row = random.nextInt(3) + 3;
        col = random.nextInt(3);
    }
    if(square == 4) {
        row = random.nextInt(3) + 3;
        col = random.nextInt(3) + 3;
    }
    if(square == 5) {
        row = random.nextInt(3) + 3;
        col = random.nextInt(3) + 6;
    }
    if(square == 6) {
        row = random.nextInt(3) + 6;
        col = random.nextInt(3);
    }
    if(square == 7) {
        row = random.nextInt(3) + 6;
        col = random.nextInt(3) + 3;
    }
    if(square == 8) {
        row = random.nextInt(3) + 6;
        col = random.nextInt(3) + 6;
    }

其中square是网格中正方形的索引(square = 0,1,...,8)

我无法弄清楚如何以更好的方式编写它。

一些想法?感谢

3 个答案:

答案 0 :(得分:2)

这适用于任何方形尺寸。在你的情况下是3x3,所以大小是3。

int size = 3;
row = random.nextInt(size) + (square / size) * size;
col = random.nextInt(size) + (square % size) * size;

答案 1 :(得分:1)

像这样的东西

int[] rowAdd = new int[] { 0, 0, 0, 3, 3, 3, 6, 6, 6 };
int[] colAdd = new int[] { 0, 3, 6, 0, 3, 6, 0, 3, 6 };
row = random.nextInt(3) + rowAdd[square];
col = random.nextInt(3) + colAdd[square];

输入一个应添加到变量row的数组值,并将其命名为rowAdd。在第二个数组colAdd中放置应该添加到col的变量 最后,像索引一样使用square来获取正确的加法值。

当然,数组rowAddcolAdd应该是方法的一部分。 (每次调用方法时,创建新数组都需要大量时间和内存)。这些数组应该与类相关,因此它们应该是static

答案 2 :(得分:0)

这是一次性所有事情的代码

public class Test {
    public static void main(String[] args) {
        //initializing arrays
        int[][] grid = new int[9][9];
        int[] numbers = new int[9];

        //populating grid
        for(int i = 0; i < 9; i++) {
            for(int j = 0; j < 9; j++) {
                grid[i][j] = (int)(Math.random()*10);
            }
        }

        //printing grid
        for(int i = 0; i < 9; i++) {
            for(int j = 0; j < 9; j++) {
                System.out.print(grid[i][j]);
            }
            System.out.println();
        }

        System.out.println();

        int counter = 0;
        //first and second loops counts for 0,3,6
        for(int i = 0; i < 9; i += 3) {
            for(int j = 0; j < 9; j += 3) {
                //after taking i or j values(which must be either 0,3 or 6) goes for 3x3 parts and saving those numbers in number array
                for(int t = i; t < i+3; t++) {
                    for(int k = j; k < j+3; k++) {
                        numbers[counter] = grid[t][k];
                        counter++;
                    }
                }

                //you can pick randomly from numbers array here

                //showing which numbers picked
                for(int t = 0; t < 9; t++) {
                    System.out.print(numbers[t]);
                }
                System.out.println();
                System.out.println();
                counter = 0;
            }
        }
    }
}