java 填数独_Java生成数独函数

突然想写一下生成算法。代码注释的比较多,应该比较好理解

使用了递归

import java.util.ArrayList;

public class Sudoku {

static int sudokuBoard[][] = new int[9][9];

public static void main(String[] args){

generateMatrix(0);

}

//获取某点可用数列

static ArrayList getVaildValueList(int x, int y){

ArrayList vaildList = new ArrayList<>();

for(int i =1; i < 10;i++){

vaildList.add(i);

}

//x,y轴去重复

for(int i = 0;i < 9;i++){

Integer invaildNum1 = sudokuBoard[x][i];

Integer invaildNum2 = sudokuBoard[i][y];

if(invaildNum1 != 0 && vaildList.contains(invaildNum1)){

vaildList.remove(invaildNum1);

}

if(invaildNum2 != 0 && vaildList.contains(invaildNum2)){

vaildList.remove(invaildNum2);

}

}

//九小格去重复

for(int i = (x/3)*3; i

for(int j = (y/3)*3; j

Integer invaildNum = sudokuBoard[i][j];

if(invaildNum != 0 && vaildList.contains(invaildNum)){

vaildList.remove(invaildNum);

}

}

}

return vaildList;

}

//生成数独函数,便于传参使用,pos参数使用单个int代替

static boolean generateMatrix(int pos){

//pos对应的x,y

int x = pos/9;

int y = pos%9;

//生成本节点可用使用的值列表

ArrayList validList = getVaildValueList(x, y);

//如果没有可用值返回false

if (validList.isEmpty()) {

return false;

}

//有值可以用,遍历值

for(int i =0; i < validList.size();i++){

sudokuBoard[x][y] = validList.get(i);

//如果此次赋值已经赋值到了最后一位,则输出整个数独。本应该这里是return true的地方,但是那样如果需要更多的结果就显示不出来了。

if(pos == 80){

for(int m = 0; m< sudokuBoard.length;m++){

for(int n = 0; n

System.out.print(sudokuBoard[m][n]);

}

System.out.println();

}

System.out.println("--------------------------");

sudokuBoard[x][y] = 0;

return false;

}

if(generateMatrix(pos+1) == true){ //递归在这

return true;

}

if(i == validList.size()-1) {

sudokuBoard[x][y] = 0;

return false;

}

}

return true;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成数独题目的方法可以通过编程语言Java来实现。为了生成一个合法的数独题目,需要确保以下条件: 1. 没有重复的数字出现在每一行、每一列和每一个3x3的九宫格中; 2. 开始时,数独题目中预的数字(已知的数字)应该保证唯一性; 3. 生成数独题目应该有唯一解。 首先,可以创建一个9x9的二维数组,用于表示数独的九宫格。然后,通过递归的方式充九宫格。 具体实现可以按照以下步骤进行: 1. 创建一个递归函数 `solveSudoku()`,用于充九宫格中的数字; 2. 在递归函数中,首先判断数独题目是否已经充完毕(即所有的空格都已经入数字),如果是则返回 true; 3. 遍历九宫格中的空格,找到第一个没有数字的格子; 4. 对该格子尝试入数字 1-9,判断是否合法(即是否满足数独的要求); 5. 如果入的数字合法,则递归调用 `solveSudoku()` 函数继续充下一个格子; 6. 如果入的数字不合法,则尝试下一个数字,直到找到合法的数字或者遍历完所有数字; 7. 如果所有数字都尝试过,都不合法,则返回 false,同时回溯到上一个格子; 8. 当递归函数返回 true 时,表示已经成功充了所有的格子,并且生成了一个合法的数独题目。 通过以上的步骤,就可以使用Java生成一个合法的数独题目。具体的代码可以根据上述思路进行编写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值