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<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生成数独函数的更多相关文章
- Android使用JNI(从java调用本地函数)
当编写一个混合有本地C代码和Java的应用程序时,需要使用Java本地接口(JNI)作为连接桥梁.JNI作为一个软件层和API,允许使用本地代码调用Java对象的方法,同时也允许在Java方法中调用本 ...
- Linux平台下Java调用C函数
JNI是Java native interface的简写,可以译作Java原生接口.Java可以通过JNI调用C/C++的库,这对于那些对性能要求比较高的Java程序无疑是一个 福音. 使用JNI也是 ...
- 【转】Java生成对应字符串的MD5密码模块
原文网址:http://www.cnblogs.com/xudong-bupt/archive/2013/05/10/3070899.html (1)一般使用的数据库中都会保存用户名和密码,其中密码不 ...
- Java生成MD5加密字符串代码实例
这篇文章主要介绍了Java生成MD5加密字符串代码实例,本文对MD5的作用作了一些介绍,然后给出了Java下生成MD5加密字符串的代码示例,需要的朋友可以参考下 (1)一般使用的数据库中都会保存用 ...
- c语言小程序以及java生成注释文档方法
c语言小程序:sizeof和strlen() sizeof运算符以字节为单位给出数据的大小,strlen()函数以字符为单位给出字符串的长度,字符和字节不是一回事. char类型用于存储字母和标点符号 ...
- C# 通过java生成的RSA公钥加密和解密
最近工作需要将对方公司生成的RSA加密公钥进行明文加密和解密,发现了几点贴出来做个笔记. RSA单次加密是有长度限制!微软封装的加密方法如果出现长度超出指定范围的话报错是直接报“该项不适于在指定状态下 ...
- java生成word的几种方案
http://blog.sina.com.cn/s/blog_a5e968370101crtl.html 1. Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建 ...
- 一次Java解析数独的经历
1. 背景 中午下楼去吃饭,电梯里看到有人在玩数独,之前也玩过,不过没有用程序去解过,萌生了一个想法,这两天就一直想怎么用程序去解一个数独.要去解开一个数独,首先要先了解数独的游戏规则,这样才能找到对 ...
- JAVA生成word的几种方法对比
首先介绍几种java导出word方案 1.Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁.使用Jacob自带的DLL动态链接库,并通过JNI的方式实现 ...
随机推荐
- Crowdsourcing[智能辅助标注]
为了实现标注平台智能辅助标注的能力,即上传一个标注任务,开始不提供辅助任务,随着用户标注的进行,后台可以收集一部分的标记数据,然后开启模型训练,并接着提供模型服务功能.然后再收集数据,再不断的训练,然 ...
- 如何应用ML的建议-上
本博资料来自andrew ng的13年的ML视频中10_X._Advice_for_Applying_Machine_Learning. 遇到问题-部分(一) 错误统计-部分(二) 正确的选取数据集- ...
- CF1097D Makoto and a Blackboard 积性函数、概率期望、DP
传送门 比赛秒写完ABC结果不会D--最后C还fst了qwq 首先可以想到一个约数个数\(^2\)乘上\(K\)的暴力DP,但是显然会被卡 在\(10^{15}\)范围内因数最多的数是\(978217 ...
- java线程池和中断总结
目录 java线程池和中断总结 一. 线程池的使用 二. java中断机制 中断的处理 三. 线程间通信机制总结 java线程池和中断总结 本系列文是对自己学习多线程和平时使用过程中的知识梳理,不适合 ...
- Iterable接口
Iterable接口 总览 这个接口用来表明可以进行迭代.具体的迭代方式,可以通过iterator()方法获取到一个迭代器,在迭代器中会实现如何获取下一个元素,以及是否迭代结束. java8中源码如下 ...
- LiveCharts文档-3开始-3类型和设置
原文:LiveCharts文档-3开始-3类型和设置 LiveCharts文档-3开始-3类型和设置 类型和设置 这一部分非常的重要,涉及到LiveCharts的基本构成单元的介绍 LiveChart ...
- 调用不同目录类的protected构造器
一.问题 二.分析 调用不同目录类的protected构造器,IDE报错. 二.解决办法: 后面添加一个{}就可以了
- Mybatis教程-实战看这一篇就够了
转自:https://blog.csdn.net/hellozpc/article/details/80878563 1.从JDBC谈起 1.1.使用IDEA创建maven工程 1.2.引入mysql ...
- Mybatis 中 columnPrefix别名的用法
1.映射对应的属性,区分他们分别属于哪些类.(sql书写的时候为什么要将前缀加上(别名),是因为便于它去寻找哪个类的前缀是ANNEX_) 2.例: 如下所示当一个collection 定义了一个co ...
- 【下一代核心技术DevOps】:(七)持续集成Jenkins的应用(Aliyun Pipiline持续构建)
1. 前言 使用Jenkins比较好的就是可以在整个构建顺序中增加自定义的动作,比如构建成功给Leader发个邮件,给团队核心发个微信什么的. 当然最基本的核心还是它可以构建多种开发语言的项目,此类构 ...