数独算法

本文介绍了一种基于Java实现的数独求解算法。通过分析数独盘面数据,使用排除法逐步确定每个空格的可能数值,最终完成数独盘面的填充。算法能够处理并解决绝大多数数独难题。

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


import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;


public final class Demo {

final static int MACH_RESULT = -1; //多解
final static int NONE_RESULT = 0; //无解
/*
Description
推理数独数字
Input Param
sdata 需要推理的数独数据
Return Value
推理成功的数组
失败或其他异常返回null
*/
public static int[][] sudokuDataSolve(int[][] sdata)
{
int i =0,j = 0;
while(!isGameOver(sdata)){

if(sdata[i][j] == 0){
int num = theValue(sdata,i,j);
if(num == NONE_RESULT){
return null;
}else if(num > 0){
sdata[i][j] = num;
i = 0;
j = 0;
}
}
j ++;
if(j == 9){
j = 0;
i ++;
if(i == 9){
return null;
}
}

}

return sdata;
}
public static int theValue(int[][] sdate,int row,int line){
List<Integer> maybeValue = new ArrayList<Integer>();
maybeValue.add(1);
maybeValue.add(2);
maybeValue.add(3);
maybeValue.add(4);
maybeValue.add(5);
maybeValue.add(6);
maybeValue.add(7);
maybeValue.add(8);
maybeValue.add(9);
for (int i = 0; i < 9; i++) {
if(sdate[row][i] != 0){
maybeValue.remove(new Integer(sdate[row][i]));
}
if(sdate[i][line] != 0){
maybeValue.remove(new Integer(sdate[i][line]));
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if(sdate[row / 3 + i][line / 3 + j] != 0){
maybeValue.remove(new Integer(sdate[row / 3 + i][line / 3 + j]));
}
}
}
if (maybeValue.size() == 1) {
return maybeValue.get(0);
}else if (maybeValue.size() == 0) {
return NONE_RESULT; //无解
}else{
return MACH_RESULT;
}

}
public static boolean isGameOver(int[][] sdata){
for (int i = 0; i < sdata.length; i++) {
for (int j = 0; j < sdata[0].length; j++) {
if(sdata[i][j] == 0){
return false;
}
}
}
return true;
}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值