`
shenjun134
  • 浏览: 16956 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

数独算法实现(递归方式)

    博客分类:
  • java
 
阅读更多
package com.sudoku;

public class sodu {
	private int[][] sodu = null;
	private int[] tai = null;

	/**
	 * 构造方法 因为每执行一次递归都会把数组tai元素全置为-1. 所以在执行一次递归后需要重新给tai赋值。
	 */
	public sodu() {

		do {
			this.init();

			tai = getMixArray();
			generateNum(0, 0, 0, 0); // upleft

			tai = getMixArray();
			generateNum(0, 3, 0, 3); // up

			tai = getMixArray();
			generateNum(0, 6, 0, 6); // upright

			tai = getMixArray();
			generateNum(3, 0, 3, 0); // left

			tai = getMixArray();
			generateNum(3, 6, 3, 6); // right

			tai = getMixArray();
			generateNum(6, 0, 6, 0); // downleft

			tai = getMixArray();
			generateNum(6, 3, 6, 3); // down

			tai = getMixArray();
			generateNum(6, 6, 6, 6); // downright
		} while (this.checkZERO());

	}

	/**
	 * 得到一个随机数组(元素1到9无重复)
	 * 
	 * @param array
	 */
	private int[] getMixArray() {
		int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		for (int i = 0; i < array.length; i++) {
			int rand = (int) (Math.random() * 9);
			int middle = array[i];
			array[i] = array[rand];
			array[rand] = middle;
		}
		return array;
	}

	/**
	 * 初始化数独数组 会初始化正中间的3*3矩阵
	 */
	private void init() {
		sodu = new int[9][9];

		int[] array = this.getMixArray();
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				sodu[3 + i][3 + j] = array[i * 3 + j];
			}
		}
	}

	/**
	 * 打印
	 */
	public void print() {
		String flag = "~";
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				System.out.print("[" + sodu[i][j] + "]");
				if (j % 3 == 2 && j < 8) {
					System.out.print(flag);
				}
			}
			System.out.println();
			if (i % 3 == 2 && i < 8) {
				for (int k = 0; k < 14; k++) {
					System.out.print(" ");
					System.out.print(flag);
				}
				System.out.println();
			}

		}
	}

	/**
	 * 递归方法
	 * 
	 * 生成(row,erect)处的值
	 * 
	 * xi和xj 分别是初始调用该方法时的row和erect
	 * 
	 * @return
	 */
	private boolean generateNum(int row, int erect, int xi, int xj) {
		if (row - xi == 3)
			return true;
		for (int i = 0; i < tai.length; i++) {
			if (tai[i] != -1 && isGood(row, erect, tai[i])) {
				sodu[row][erect] = tai[i];
				tai[i] = -1;
				if (erect - xj < 2) {
					if (generateNum(row, erect + 1, xi, xj)) {
						return true;
					} else {
						tai[i] = sodu[row][erect];
						sodu[row][erect] = 0;
						continue;
					}
				} else {
					if (generateNum(row + 1, xj, xi, xj)) {
						return true;
					} else {
						tai[i] = sodu[row][erect];
						sodu[row][erect] = 0;
						continue;
					}
				}
			}
		}
		return false;
	}

	/**
	 * 判断数字number是否可以用在坐标(x,y)处
	 */
	private boolean isGood(int i, int j, int number) {
		for (int m = 0; m < 9; m++) {
			if (sodu[i][m] == number) {
				return false;
			}
		}
		for (int n = 0; n < 9; n++) {
			if (sodu[n][j] == number) {
				return false;
			}
		}
		return true;
	}

	/**
	 * 判断数独数组中是否有0
	 */
	private boolean checkZERO() {
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				if (sodu[i][j] == 0) {
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * 程序入口
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		new sodu().print();
	}
}
分享到:
评论

相关推荐

    数独算法,数独游戏

    总的来说,这个项目提供了数独游戏的实现,其核心算法基于非递归的深度优先搜索,具有一定的算法学习价值。同时,通过"SuDoku.sln"和"Thread"的文件名,我们可以推测项目还涉及软件工程的方面,如使用IDE进行项目...

    delphi编写的数独递归算法

    在本主题中,我们将深入探讨如何使用Delphi来编写一个基于递归算法的数独求解器。 首先,理解递归算法是关键。递归是一种解决问题的方法,它通过调用自身来解决更小的问题,直到达到基本情况,即问题变得足够简单...

    递归回溯算法破解数独

    这种互动方式有助于学习者直观地理解递归回溯算法如何在数独问题中寻找解。 总的来说,通过这个项目,我们可以深入学习递归回溯算法的工作原理,以及如何将其应用到实际问题中,特别是数独这样的经典难题。此外,...

    数独算法,C语言编写,注释很详细。

    在这个压缩包中,包含了一个名为“数独算法.cpp”的C语言源代码文件,用于实现数独的求解算法。 首先,我们来看数独问题的表示。在C语言中,通常会用二维数组来表示数独的矩阵。例如,定义一个9x9的二维数组,数组...

    易语言数独算法

    综上所述,易语言数独算法源码的设计和实现涉及到数组操作、条件判断、递归、回溯、搜索策略、错误处理、代码优化、调试测试和用户界面等多个编程技术。通过对这些知识点的深入理解和实践,我们可以构建一个高效且...

    数独游戏算法(C实现)

    "数独游戏算法(C实现)" 数独游戏算法是指使用计算机程序来解决数独游戏的算法。数独游戏是一种流行的逻辑游戏,玩家需要填充一个9x9的矩阵,使得每行、每列和每宫中都包含数字1-9,且每个数字只能出现一次。数独...

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

    递归回溯法是一种通过试错的方式来解决问题的算法。在数独的上下文中,它的工作原理是从空白格子开始,尝试填充可能的数字(1到9),如果该数字在当前行、列或小宫格内没有出现过,就继续填充下一个空格;如果遇到...

    数独递归:实现了递归回溯数独求解算法

    通过回溯所有可能的解决方案来实现递归方法来解决数独问题。 返回第一个解决方案。 提供了3个示例网格。 运行如下: python3 main.py 001.grid 网格文件格式 每行是一行 零表示缺少数字 以下Computerphile视频...

    matlab数独算法

    在给定的标题“matlab数独算法”中,我们讨论的是如何使用MATLAB编程语言来实现数独的自动填充算法。 MATLAB是一种高级编程环境,常用于数值计算、符号计算、数据可视化和图像处理等任务。由于其简洁的语法和强大的...

    VB数独,简单算法通俗易懂

    在VB中实现数独算法,通常会用到以下技术: - 控件数组:用于表示数独网格,方便批量处理单元格。 - 循环和条件语句:遍历网格,判断数字的合法性。 - 变量和数组:存储当前填入的数字、可能的数字列表等信息。 - ...

    用C++完成数独算法

    在本文中,我们将探讨如何使用C++来实现数独算法,一种解决...总的来说,通过理解和实现这样的数独算法,你可以掌握C++中的数据结构(如栈)、递归以及问题解决策略(如回溯法),这些都是计算机科学中非常重要的概念。

    递归回溯求解数独 C++

    用递归回溯方法求解数独的C++代码,附详细注解,方便他人参考学习。代码系本人原创。

    数独游戏的简单实现

    为了实现数独游戏,我们可以采取递归的思想,首先生成一个完整的数独,然后将其中的一部分数字挖去形成初始数独。对于数独的求解,也可以采用相同的方法。下面将对实现的部分代码进行详细的解释。 初始化数独的实现...

    java数独生成算法及基于此算法的android数独游戏APK

    在APK文件"Sudoku.apk"中,除了核心的数独算法实现外,还包含了Android应用的资源文件(如布局文件、图片、音频等)、AndroidManifest.xml(应用配置)、以及其他必要的组件。用户可以通过安装这个APK在Android设备...

    回溯算法求数独的解

    实现回溯算法求解数独的步骤可以分为以下几个关键部分: 1. **初始化**:创建一个空的数独矩阵,表示待解的数独题目,或者从已知的数独题目开始。 2. **选择单元格**:找到当前未填充的单元格,作为下一个要填入...

    数独程序算法,有用的算法

    在编程领域,实现数独解法通常涉及算法设计,本项目提供了一个基于Java的数独解决方案。 首先,我们需要理解数独问题的本质是一个回溯搜索问题,可以采用深度优先搜索(DFS)策略来解决。DFS是一种遍历或搜索树或图...

    9x9数独算法

    数独是一种广受欢迎的逻辑游戏,它通过填充一个9×9的网格,使得每一行、每一列以及每一个3×3的小宫格(也...这个9x9数独算法不仅可以作为一个独立的编程练习,也可以作为学习数据结构、算法和递归思想的一个实例。

    shudu.rar_java 数独算法_shudu_数独

    本项目是一个用Java实现的数独算法,结合了一个用户界面,便于玩家交互。 在Java中实现数独算法,通常涉及以下关键点: 1. **数据结构设计**:首先,我们需要一个数据结构来存储数独的当前状态。这通常是一个二维...

    Android数独C++算法案例

    在C++中,可以通过递归实现回溯,创建一个二维数组表示数独网格,并用一个标志数组记录已填充的数字,以避免重复。 - 迭代加深搜索法:这种方法是在深度优先搜索的基础上增加深度限制,每次尝试在更深的层次解决...

    9*9数独算法

    9*9数独算法:采用递归算法遍历求解数独问题。如果有多个解会全部打印。空位输入0

Global site tag (gtag.js) - Google Analytics