数独アルゴリズム実装
2602 ワード
package com.sudoku;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Sudoku {
private static int[][] DATA = new int[9][9];
private static int[] DATA_1_9 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
private static Random ran = new Random();
public static int generateNum(int erect, int row) {
if (0 == erect && 0 == row) {
return DATA_1_9[ran.nextInt(9)];
}
List<String> list = new ArrayList<String>();
for (int i = 0; i < 9; i++) {
list.add("" + (i + 1));
}
for (int i = 0; i < row && row < 9; i++) {
list.remove("" + DATA[i][erect]);
}
for (int i = 0; i < erect && erect < 9; i++) {
list.remove("" + DATA[row][i]);
}
if (list.size() == 0) {
return 0;
}
return Integer.valueOf(list.get(ran.nextInt(list.size())));
}
public static void init() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
DATA[i][j] = generateNum(j, i);
}
}
}
public static boolean checkZERO() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (DATA[i][j] == 0) {
return true;
}
}
}
return false;
}
public static void generate() {
while (checkZERO()) {
init();
}
print();
}
public static void print() {
String flag = "~";
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
System.out.print("[" + DATA[i][j] + "]");
if (j % 3 == 2 && j < 8) {
System.out.print(flag);
}
}
System.out.println();
if (i % 3 == 2 && i < 8) {
for (int k = 0; k < 14; k++) {
System.out.print(" ");
System.out.print(flag);
}
System.out.println();
}
}
}
public static void main(String[] args) {
long startTime1 = System.nanoTime();
new sodu().print();
System.out.println("Total time1: " + (System.nanoTime() - startTime1));
long startTime2 = System.nanoTime();
generate();
System.out.println("Total time2: " + (System.nanoTime() - startTime2));
}
}