数独算法实现(循环方式)

本文介绍了一个使用Java实现的数独生成算法。该算法通过确保每一行、每一列都不重复的原则来生成完整的数独盘面,并提供了打印功能展示生成结果。通过对数独盘面的不断初始化直至所有格子都有数字填充,最终输出一个有效的数独解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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));
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值