`

数独算法源代码(未用递归)

阅读更多
/**
* 数独程序
*/
public class ShuDu {
/**存储数字的数组*/
static int[][] n = new int[9][9];
/**生成随机数字的源数组,随机数字从该数组中产生*/
static int[] num = {1,2,3,4,5,6,7,8,9};
public static void main(String[] args) {
//生成数字
for(int i = 0;i < 9;i++){
//尝试填充的数字次数
int time = 0;
//填充数字
for(int j = 0;j < 9;j++){
//产生数字
n[i][j] = generateNum(time);
//如果返回值为0,则代表卡住,退回处理
//退回处理的原则是:如果不是第一列,则先倒退到前一列,否则倒退到前一行的最后一列
if(n[i][j] == 0){
//不是第一列,则倒退一列
if(j > 0){
j-=2;
continue;
}else{//是第一列,则倒退到上一行的最后一列
i--;
j = 8;
continue;
}
}
//填充成功
if(isCorret(i,j)){
//初始化time,为下一次填充做准备
time = 0;
}else{ //继续填充
//次数增加1
time++;
//继续填充当前格
j--;
}
}
}
//输出结果
for(int i = 0;i < 9;i++){
for(int j = 0;j < 9;j++){
System.out.print(n[i][j] + " ");
}
System.out.println();
}
}

/**
* 是否满足行、列和3X3区域不重复的要求
* @param row 行号
* @param col 列号
* @return true代表符合要求
*/
public static boolean isCorret(int row,int col){
return (checkRow(row) & checkLine(col) & checkNine(row,col));
}

/**
* 检查行是否符合要求
* @param row 检查的行号
* @return true代表符合要求
*/
public static boolean checkRow(int row){
for(int j = 0;j < 8;j++){
if(n[row][j] == 0){
continue;
}
for(int k =j + 1;k< 9;k++){
if(n[row][j] == n[row][k]){
return false;
}
}
}
return true;
}

/**
* 检查列是否符合要求
* @param col 检查的列号
* @return true代表符合要求
*/
public static boolean checkLine(int col){
for(int j = 0;j < 8;j++){
if(n[j][col] == 0){
continue;
}
for(int k =j + 1;k< 9;k++){
if(n[j][col] == n[k][col]){
return false;
}
}
}
return true;
}

/**
* 检查3X3区域是否符合要求
* @param row 检查的行号
* @param col 检查的列号
* @return true代表符合要求
*/
public static boolean checkNine(int row,int col){
//获得左上角的坐标
int j = row / 3 * 3;
int k = col /3 * 3;
//循环比较
for(int i = 0;i < 8;i++){
if(n[j + i/3][k + i % 3] == 0){
continue;
}
for(int m = i+ 1;m < 9;m++){
if(n[j + i/3][k + i % 3] == n[j + m/3][k + m % 3]){
return false;
}
}
}
return true;
}

/**
* 产生1-9之间的随机数字
* 规则:生成的随机数字放置在数组8-time下标的位置,随着time的增加,已经尝试过的数字将不会在取到
* 说明:即第一次次是从所有数字中随机,第二次时从前八个数字中随机,依次类推,
* 这样既保证随机,也不会再重复取已经不符合要求的数字,提高程序的效率
* 这个规则是本算法的核心
* @param time 填充的次数,0代表第一次填充
* @return
*/
public static int generateNum(int time){
//第一次尝试时,初始化随机数字源数组
if(time == 0){
for(int i = 0;i < 9;i++){
num[i] = i + 1;
}
}
//第10次填充,表明该位置已经卡住,则返回0,由主程序处理退回
if(time == 9){
return 0;
}
//不是第一次填充
//生成随机数字,该数字是数组的下标,取数组num中该下标对应的数字为随机数字
int ranNum = (int)(Math.random() * (9 - time));
//把数字放置在数组倒数第time个位置,
int temp = num[8 - time];
num[8 - time] = num[ranNum];
num[ranNum] = temp;
//返回数字
return num[8 - time];
}
}
分享到:
评论

相关推荐

    极简 数独 vb源代码-递归回溯法

    总的来说,"极简VB数独源代码-递归回溯法"是一个优秀的编程实践案例,它展示了如何利用递归和回溯策略解决复杂问题,同时也体现了编程设计中的简洁原则。无论是为了学习、教学还是娱乐,这个项目都是一个值得深入...

    数独求解源代码

    源代码是程序员编写的未经过编译器处理的原始程序,通过编译后可生成可执行文件,如这里的"数独.exe"。 SD.CPP是主程序文件,通常包含了数独求解的核心算法。在C++中,解决数独问题可能采用回溯法或者深度优先搜索...

    android数独游戏源代码

    生成算法可能使用回溯法,解决算法可能是递归或迭代的深度优先搜索,验证则检查每一行、每一列和每个宫格的数字是否符合规则。 5. **事件监听与响应**:Android的`OnClickListener`接口用于监听用户在数独单元格上...

    VB做的数独程序源代码和工程文件

    下面将详细介绍这个VB数独程序源代码和工程文件中的关键知识点。 1. **VB基础语法与结构**: VB是基于事件驱动的编程语言,它的程序由一系列的事件处理函数组成。在这个数独程序中,你可能会看到`Private Sub`和`...

    数独解算器源代码

    用vc++6.0实现的数独解算...用改进的回溯法递归实现寻优过程。能对有解数独迅速给出一个合法解;对无解数独可以给出报错提示。 该程序在普通计算机解决芬兰数学家于2012年7月给出的最难数独,用时需1~10秒。欢迎交流。

    VB数独游戏源代码

    VB数独游戏源代码是一个基于Visual Basic(VB)开发的数独游戏程序,它提供了玩家一个界面友好、功能完备的平台来解决数独谜题。数独是一种逻辑推理游戏,玩家需要通过填充数字来完成一个9x9的网格,使得每一行、每...

    C#数独游戏源代码

    本篇文章将详细解析一款用C#编写的数独游戏源代码,旨在帮助学习者理解游戏的实现机制和C#编程技巧。 首先,数独游戏的核心在于其规则:9x9的网格被分为9个3x3的小宫格,每一行、每一列以及每一个小宫格都必须包含...

    sudoku 数独游戏vc源代码

    3. **数独算法**:核心算法可能是基于回溯法或递归的,用于生成合法的数独解。这种算法在尝试填充数字时,如果发现某位置数字不合法,则会回溯到上一步,尝试其他可能性,直到找到唯一解。 4. **图形界面设计**:...

    数独游戏源代码

    数独游戏源代码是一款使用Java语言开发的移动应用,专为Android系统设计,旨在提供一个在智能手机上玩数独的平台。在这个项目中,开发者利用Java的面向对象特性,构建了一个用户友好的界面,以及一套完整的数独逻辑...

    数独计算器源代码C#语言

    数独是一种广受欢迎的逻辑推理...通过阅读和理解源代码,你可以掌握如何在C#环境中构建一个功能完备的数独计算器,同时深化对回溯法、递归、数据结构和逻辑推理的理解。这对于提升编程技能和逻辑思维能力都非常有帮助。

    suku.rar_手机游戏_数独_数独 JAVA_数独源代码

    4. **算法**:数独的核心是解决算法,这包括回溯法、递归、DFS(深度优先搜索)或更复杂的策略,如候选数法。这些算法用于检查输入的有效性,并在必要时自动填充缺失的数字。 5. **错误检查与合法性验证**:游戏...

    数独程序源代码(C语言)

    通过分析`sudoku.c`源代码,我们可以深入学习C语言编程、算法设计、数据结构(如二维数组)、递归与回溯法等重要概念,同时了解如何在Linux环境中编写和运行命令行程序。这些知识对于提升C语言编程技能和理解复杂...

    自己写的数独游戏i源代码

    源代码分析可以帮助我们更好地理解作者是如何处理这些挑战的,例如,他可能使用了哪种数据结构来表示数独盘面,如何实现高效且易于扩展的错误检查,以及如何设计用户友好的数字提示机制。 总的来说,这个数独游戏...

    数独自动求解程序源代码

    这个“数独自动求解程序源代码”项目,显然是为了实现自动解决数独谜题的算法,并且是使用Visual Studio 2010进行编译的。 首先,我们要了解这个程序的基础:C++编程语言。C++是面向对象的编程语言,以其高效和灵活...

    自制数独游戏JAVA源程序与源代码全部开源.zip

    这个压缩包文件“自制数独游戏JAVA源程序与源代码全部开源.zip”包含了一个使用Java编程语言实现的数独游戏的源代码,对于学习Java编程和游戏开发的开发者来说,这是一个很好的学习资源。 首先,从编程语言的角度来...

    Delphi10.4.2编写的数独游戏源代码

    《Delphi10.4.2数独游戏源代码解析》 数独,作为一种流行的逻辑游戏,深受全球玩家喜爱。而使用编程语言实现数独游戏,不仅能够锻炼编程技巧,还能深入理解递归算法和逻辑推理。本篇将对基于Delphi10.4.2开发的数独...

    VB—数独解码器,附加源代码及详细注释

    在这个VB数独解码器的源代码中,你应该能看到如何定义和操作数独网格的数组,以及如何实现回溯法的逻辑。对于VB初学者来说,这是一个很好的实践项目,因为它涵盖了基本的数组操作、条件判断、循环控制以及递归等核心...

    C语言部分算法源代码

    这个名为"C语言部分算法源代码"的压缩包文件,显然是一份珍贵的资源,包含了C语言实现的一些经典算法。这些算法是计算机科学的基础,对于学习和提升编程技能,尤其是对算法的理解和应用,具有重要的价值。 1. **...

    自动 解数独 源代码

    本自动解数独源代码是用Visual Basic 2010(VB2010)编写的,VB2010是Microsoft公司开发的一种面向对象的编程环境,它支持事件驱动编程模型,特别适合创建图形用户界面(GUI)应用程序。由于VB2010依赖于.NET ...

    数独sodu c++源程序

    在这个“数独sodu c++源程序”中,我们将探讨如何用C++语言实现数独的生成、解决算法。 首先,我们需要理解数独问题的本质:它是一个典型的回溯法问题。回溯法是一种试探性的解决问题的方法,通过尝试所有可能的解...

Global site tag (gtag.js) - Google Analytics