發新話題

[教學]數獨的Java程式

[教學]數獨的Java程式

複製內容到剪貼板
代碼:
import java.io.*;

public class sudoku {

  static void SolvePuzzle() {
    GetAns();
  }

  static boolean GetAns() {
    for (int i = 0; i < 9; i++) {
      for (int j = 0; j < 9; j++) {
        if (puzzle[i][j] <= 0) {
          next_value:for (int value = 1; value <= 9; value++) {
            // On the same column, make sure no any row already used it
            // On the same row, make sure no any column already used it
            for (int k = 0; k < 9; k++) {
              if ( (puzzle[k][j] == value) || (puzzle[i][k] == value)) {
                continue next_value;
              }
            }
            // On the 3x3 box, make sure no other cell already used it
            int p = (i / 3) * 3;
            int q = (j / 3) * 3;
            for (int x = 0; x < 3; x++) {
              for (int y = 0; y < 3; y++) {
                if (puzzle[p + x][q + y] == value) {
                  continue next_value;
                }
              }
            }

            puzzle[i][j] = (byte) value;
            if (GetAns()) {
              return true;
            }
            else {
              puzzle[i][j] = 0;
            }
          }
          return false;
        }
      }
    }
    return true;
  }

  public static void main(String[] args) {
    String datafile = "sudoku.txt";
    if (args.length > 1) {
      datafile = args[0];
    }
    System.out.println("Read puzzle file:" + datafile);
    ReadPuzzle(datafile);
    PrintPuzzle();
    // Solve the puzzle
    long starttime = System.currentTimeMillis();
    SolvePuzzle();
    long endtime = System.currentTimeMillis();
    System.out.println("\nSolve puzzle in " + (endtime - starttime) +
                       " microseconds.");
    PrintPuzzle();
    boolean success = CheckRule();
    if (success) {
      System.out.println("Good Job!");
    }
    else {
      System.out.println("Oops! test failed, try again.");
    }
  }

  static void ReadPuzzle(String file) {
    try {
      BufferedReader in = new BufferedReader(new FileReader(file));
      String str;
      for (int r = 0; r < 9; r++) {
        try {
          str = in.readLine();
        }
        catch (IOException e1) {
          str = "";
        }
        for (int c = 0; c < 9; c++) {

          puzzle[r][c] = 0;
          if (str.length() > c) {
            puzzle[r][c] = (byte) (str.charAt(c) - '0');
          }
        }
      }
    }
    catch (FileNotFoundException e) {
      e.printStackTrace();
      return;
    }
  }

  static void PrintPuzzle() {
    int row, col;
    System.out.println(" |123456789");
    System.out.println("-+---------");
    for (row = 0; row < 9; row++) {
      System.out.print(row + 1);
      System.out.print("|");
      for (col = 0; col < 9; col++) {
        byte b = puzzle[row][col];
        if (b < 1 || b > 9) {
          System.out.print('-');
        }
        else {
          System.out.print(puzzle[row][col]);
        }
      }
      System.out.println("");
    }
    System.out.println("-+---------");
  }

  static boolean CheckRule() {
    int[] row_score = {
        0, 0, 0, 0, 0, 0, 0, 0, 0};
    int[] col_score = {
        0, 0, 0, 0, 0, 0, 0, 0, 0};
    int[] box_score = {
        0, 0, 0, 0, 0, 0, 0, 0, 0};
    int r, c, box_r, box_c;
    int score = 0;
    for (r = 0; r < 9; r++) {
      for (c = 0; c < 9; c++) {
        // check row
        byte b = puzzle[r][c];
        if (b < 1 || b > 9) {
          System.out.println("(" + (r + 1) + "," + (c + 1) + ") unknown data.");
          return false;
        }
        b--;
        if (row_score[b] != score) {
          System.out.println("Row " + (r + 1) + " test failed.");
          return false;
        }
        else {
          row_score[b]++;
        }
        // check column
        b = puzzle[c][r];
        if (b < 1 || b > 9) {
          System.out.println("(" + (r + 1) + "," + (c + 1) + ") unknown data.");
          return false;
        }
        b--;
        if (col_score[b] != score) {
          System.out.println("Column " + (r + 1) + " test failed.");
          return false;
        }
        else {
          col_score[b]++;
        }
        // check 3*3 box
        box_r = (r / 3) * 3 + (c / 3);
        box_c = (r % 3) * 3 + (c % 3);
        b = puzzle[box_r][box_c];
        if (b < 1 || b > 9) {
          System.out.println("(" + (box_r + 1) + "," + (box_c + 1) +
                             ") unknown data.");
          return false;
        }
        b--;
        if (box_score[b] != score) {
          System.out.println("Box test failed at (" + (box_r + 1) + "," +
                             (box_c + 1) + ").");
          return false;
        }
        else {
          box_score[b]++;
        }
      }
      score++;
    }
    return true;
  }

  static byte[][] puzzle = {
      {
      1, 2, 3, 4, 5, 6, 7, 8, 9}
      , {
      1, 2, 3, 4, 5, 6, 7, 8, 9}
      , {
      1, 2, 3, 4, 5, 6, 7, 8, 9}
      , {
      1, 2, 3, 4, 5, 6, 7, 8, 9}
      , {
      1, 2, 3, 4, 5, 6, 7, 8, 9}
      , {
      1, 2, 3, 4, 5, 6, 7, 8, 9}
      , {
      1, 2, 3, 4, 5, 6, 7, 8, 9}
      , {
      1, 2, 3, 4, 5, 6, 7, 8, 9}
      , {
      1, 2, 3, 4, 5, 6, 7, 8, 9}
  };
}
[ 本帖最後由 philxyz0316 於 2006-8-8 21:06 編輯 ]

TOP

我從來沒想過
也可以如此去玩
感謝你了
我要來試玩一下

TOP

我也來試看看!

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。