数独アルゴリズム実装


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));
	}
}