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

使用了递归

import java.util.ArrayList;

public class Sudoku {
static int sudokuBoard[][] = new int[9][9]; public static void main(String[] args){
generateMatrix(0); }
//获取某点可用数列
static ArrayList<Integer> getVaildValueList(int x, int y){
ArrayList<Integer> 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<(x/3)*3+3; i++){
for(int j = (y/3)*3; j<(y/3)*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<Integer> 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 <sudokuBoard[m].length;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;
}
}

  

Java生成数独函数的更多相关文章

  1. Android使用JNI(从java调用本地函数)

    当编写一个混合有本地C代码和Java的应用程序时,需要使用Java本地接口(JNI)作为连接桥梁.JNI作为一个软件层和API,允许使用本地代码调用Java对象的方法,同时也允许在Java方法中调用本 ...

  2. Linux平台下Java调用C函数

    JNI是Java native interface的简写,可以译作Java原生接口.Java可以通过JNI调用C/C++的库,这对于那些对性能要求比较高的Java程序无疑是一个 福音. 使用JNI也是 ...

  3. 【转】Java生成对应字符串的MD5密码模块

    原文网址:http://www.cnblogs.com/xudong-bupt/archive/2013/05/10/3070899.html (1)一般使用的数据库中都会保存用户名和密码,其中密码不 ...

  4. Java生成MD5加密字符串代码实例

    这篇文章主要介绍了Java生成MD5加密字符串代码实例,本文对MD5的作用作了一些介绍,然后给出了Java下生成MD5加密字符串的代码示例,需要的朋友可以参考下   (1)一般使用的数据库中都会保存用 ...

  5. c语言小程序以及java生成注释文档方法

    c语言小程序:sizeof和strlen() sizeof运算符以字节为单位给出数据的大小,strlen()函数以字符为单位给出字符串的长度,字符和字节不是一回事. char类型用于存储字母和标点符号 ...

  6. C# 通过java生成的RSA公钥加密和解密

    最近工作需要将对方公司生成的RSA加密公钥进行明文加密和解密,发现了几点贴出来做个笔记. RSA单次加密是有长度限制!微软封装的加密方法如果出现长度超出指定范围的话报错是直接报“该项不适于在指定状态下 ...

  7. java生成word的几种方案

    http://blog.sina.com.cn/s/blog_a5e968370101crtl.html 1. Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建 ...

  8. 一次Java解析数独的经历

    1. 背景 中午下楼去吃饭,电梯里看到有人在玩数独,之前也玩过,不过没有用程序去解过,萌生了一个想法,这两天就一直想怎么用程序去解一个数独.要去解开一个数独,首先要先了解数独的游戏规则,这样才能找到对 ...

  9. JAVA生成word的几种方法对比

    首先介绍几种java导出word方案 1.Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁.使用Jacob自带的DLL动态链接库,并通过JNI的方式实现 ...

随机推荐

  1. spring boot配置统一异常处理

    基于@ControllerAdvice的统一异常处理 >.这里ServerException是我自定义的异常,和普通Exception分开处理 >.这里的RequestResult是我自定 ...

  2. java 基础01

    标识符:字母,下划线和美元符号,数字组成大小写敏感,无长度限制 关键字: 数据类型

  3. SA的一个辣鸡trick

    基础板子 namespace SA{ int x[400010],y[400010],SA[400010],rk[400010],ht[400010],t[400010]; int st[19][40 ...

  4. 如何打造网站克隆、仿站工具(C#版)

    前两天朋友叫我模仿一个网站,刚刚开始,我一个页面一个页面查看源码并复制和保存,花了我很多时间,一个字“累”,为了减轻工作量,我写了个网站“克隆工具”,一键克隆,比起人工操作, 效率提高了200%以上, ...

  5. 小白必须懂的MongoDB的十大总结

    小白必须懂的MongoDB的总结 一.MongoDB的认识 1.什么是MongoDB? MongoDB 是一个介于关系数据库和非关系数据库之间的开源产品,是最接近于关系型数据库的 NoSQL 数据库. ...

  6. Libp2p学习(一)

    Libp2p学习 参考资料:libp2p-specifications : https://github.com/libp2p/specs 持续更新ing 1. 介绍 Libp2p的实现目标是: 支持 ...

  7. Js把Json序列化为Java接受的对象。

    服务器端 Java定义 data class role(var name: String = "", var remark: String = "") data ...

  8. mysql操作命令梳理(4)-中文乱码问题

    在平时的mysql运维操作中,经常会碰到插入中文字段后出现乱码的情况,产生中文乱码的原因一般有:1)mysql的编码格式不对,是latin1编码.强烈推荐将mysql下的编码格式都改为utf8,因为它 ...

  9. Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

    Nginx.LVS.HAProxy 是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,通常会结合Keepalive做健康检查,实现故障转移的高可用功能. 1)在四层(tcp)实现负载均衡的 ...

  10. java 定时器中任务的启动、停止、再启动

    package com.cvicse.ump.timer.service; import java.util.Date; import java.util.Timer; import com.cvic ...