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的方式实现 ...
随机推荐
- Mysql windows版本的安装
一.mysql官网下载 下载安装包 MySQL Community Server (GPL)--> 选用zip版本的 二.安装 解压mysql的安装包. 将bin目录配置到环境变量中.(即环境变 ...
- day82
今日内容: 1.CBV源码分析: CBV:class base view(基于类的视图函数) FBV:function base view(基于方法的视图函数) 要想使用CBV首先需要导入 from ...
- php的foreach中使用取地址符,注意释放
先来举个例子: <?php $array = array(1, 2, 3); foreach ($array as &$value) {} // unset($value); forea ...
- React-state props与render()的关系
state或者props发生改变,render()j就会执行一次. 父组件的render()被重新执行时,它的子组件的render()都会重新执行.
- ASP.NET Core 2.1 源码学习之 Options[2]:IOptions
在 上一章 中,介绍了Options的注册,而在使用时只需要注入 IOption<T> 即可: public ValuesController(IOptions<MyOptions& ...
- 因写太多 BUG!程序员遭公司颁奖羞辱,做的一个比一个绝
刚入职的程序员新人,办公桌上,基本上也就一电脑.一键盘.一鼠标,再配个被杯子.然而混迹职场多年的猿老们,办公桌上都有一些彰显身份地位的“好东西”. 这张图两点颇多,最显眼的,是办公桌上那个黄黄的东西, ...
- 网站每日PV/IP统计/总带宽/URL统计脚本分享(依据网站访问日志)
在平时的运维工作中,我们运维人员需要清楚自己网站每天的总访问量.总带宽.ip统计和url统计等.虽然网站已经在服务商那里做了CDN加速,所以网站流量压力都在前方CDN层了像每日PV,带宽,ip统计等数 ...
- 变量 var &函数new
声明变量 变量:变量是存储信息的容器,创建变量通常称为"声明"变量 变量必须以字母开头(小驼峰式myName): 变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做): 变量名 ...
- visual studio 2013的使用和单元测试
Visual Studio 2013 是一个先进的开发解决方案,各种规模的团队通过它均可设计和创建引人注目的应用程序.Visual Studio 13在新功能包括C#和VB编译器和IDE支持完全基于. ...
- 《linux内核设计与实现》第三章
1.进程 进程就是正在执行的程序代码的实时结果,不仅包含可执行代码,还包括其他资源,比如:打开的文件,挂起的信号,内核内部数据结构,处理器状态,一个或多个具有内存映射的内存地址空间及一个或多个执行线程 ...