数独检查器java

时间:2014-11-18 00:55:18

标签: java sudoku

public class Sudoku {
public static void main(String[] args) {
    // Row and column Latin but with invalid subsquares 
    String config1 = "1234567892345678913456789124567891235678912346" + "78912345789123456891234567912345678";
    String[][] puzzle1 = makeSudoku(config1);

    if (isValidSudoku(puzzle1)) {
        System.out.println("This puzzle is valid.");
    } else {
        System.out.println("This puzzle is invalid.");
    }


    System.out.println(getPrintableSudoku(puzzle1));

    System.out.println("--------------------------------------------------");

    // Row Latin but column not Latin and with invalid subsquares 
    String config2 = "12345678912345678912345678912345678912345678" + "9123456789123456789123456789123456789";
    String[][] puzzle2 = makeSudoku(config2);

    if (isValidSudoku(puzzle2)) {
        System.out.println("This puzzle is valid.");
    } else {
        System.out.println("This puzzle is invalid.");
    }

    System.out.println(getPrintableSudoku(puzzle2));
    System.out.println("--------------------------------------------------");

    // A valid sudoku 
    String config3 = "25813764914698532779324685147286319558149273663" + "9571482315728964824619573967354218";
    String[][] puzzle3 = makeSudoku(config3);
    if (isValidSudoku(puzzle3)) {
        System.out.println("This puzzle is valid.");
    } else {
        System.out.println("This puzzle is invalid.");
    }
    System.out.println(getPrintableSudoku(puzzle3));
    System.out.println("--------------------------------------------------");
}

public static String[][] makeSudoku(String s) {
    int SIZE = 9;
    int k = 0;
    String[][] x = new String[SIZE][SIZE];
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            x[i][j] = s.substring(k, k + 1);
            k++;
        }
    }
    return x;
}

public static String getPrintableSudoku(String[][] x) {
    int SIZE = 9;
    String temp = "";
    for (int i = 0; i < SIZE; i++) {
        if ((i == 3) || (i == 6)) {
            temp = temp + "=================\n";
        }
        for (int j = 0; j < SIZE; j++) {
            if ((j == 3) || (j == 6)) {
                temp = temp + " || ";
            }
            temp = temp + x[i][j];
        }
        temp = temp + "\n";
    }
    return temp;
}

//sudoku validation
public static boolean isValidSudoku(String[][] x) {
    return rowsAreLatin(x) && colsAreLatin(x) && goodSubsquares(x);
}

public static boolean rowsAreLatin(String[][] x) {
    // fill in your code here 
    boolean result = true; // Assume rows are latin 
    for (int i = 0; i < 9; i++) {
        result = result && rowIsLatin(x, i); // Make sure each row is latin 
    }
    return result;
}
public static boolean rowIsLatin(String[][] x, int i) {

    boolean[] found = new boolean[9];

    for (int j = 0; j < 9; j++) {
        found[Integer.parseInt(x[i][j])] = true;
    }

    for (int j = 0; j < 9; j++) {
        if (!found[j]) {
            return false;
        }
    }
    return true;
}

public static boolean colsAreLatin(String[][] x) {
    // fill in your code here 
    boolean result = true; // Assume cols are latin 
    for (int j = 0; j < 9; j++) {
        result = result && colIsLatin(x, j); // Make sure each row is latin 
    }
    return result;
}

public static boolean colIsLatin(String[][] x, int j) {
    // fill in your code here 
    boolean[] found = new boolean[9];
    for (int i = 0; i < 9; i++) {
        found[Integer.parseInt(x[i][j])] = true;
    }

    for (int i = 0; i < 9; i++) {
        if (!found[i]) {
            return false;
        }
    }
    return true;
}

public static boolean goodSubsquares(String[][] x) {

    return true;
}
public static boolean goodSubsquare(String[][] x, int i, int j) {

    boolean[] found = new boolean[9];
    // We have a 3 x 3 arrangement of subsquares 
    // Multiplying each subscript by 3 converts to the original array subscripts 
    for (int p = i * 3, rowEnd = p + 3; p < rowEnd; p++) {
        for (int q = j * 3, colEnd = q + 3; q < colEnd; q++) {

            found[Integer.parseInt(x[p][q])] = true;

        }
    }
    for (int p = 0; p < 9; p++) {
        if (!found[p]) {
            return false;
        }
    }
    return true;
}
}

这是我得到的错误。救命啊!

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
at Sudoku.rowIsLatin(Sudoku.java:104)
at Sudoku.rowsAreLatin(Sudoku.java:93)
at Sudoku.isValidSudoku(Sudoku.java:85)
at Sudoku.main(Sudoku.java:8)
Java Result: 1

1 个答案:

答案 0 :(得分:1)

问题出在以下几行:

Integer.parseInt(x[i][j])

数独数字的范围为[1,9],但数组(长度为9)的索引范围为[0,8]。因此,当(i,j)元素为9时,索引为9,因此抛出IndexOutOfBoundsException。

您必须将其更改为

found[Integer.parseInt(x[i][j]) - 1] = true;

请注意,您也会在列的相应方法中犯同样的错误。