转载自IT学习社区:http://bbs.itcast.cn/thread-6273-1-1.html
作者:梁桐
无聊时偶尔会玩一玩益智类游戏。有一种游戏叫“数独”,满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复
突发奇想,使用Java基础编写一个自己的获得数独数据小程序。
- package cn.itcast;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Random;
- public class SudokuTest2 {
- public static void main(String[] args) {
- //数组
- int[][] soduku = new int[9][9];
- //生成数据
- getData(soduku);
- // print(soduku);
- //修改数据
- changeData(soduku);
- //打印
- print(soduku);
- // System.out.println(getValueList());
- }
- private static int currentCount; //当前循环次数
- /**
- * 修改内容
- * @param soduku
- */
- private static void changeData(int[][] soduku) {
- //获得一个数字
- for(int m = 0 ; m < soduku.length ; m ++){
- lineNumList = getValueList(); //随机生成数据
- //获得一行数据
- currentCount = 0;
- for(int i = 0 ; i < lineNumList.size() ; i ++){
- int num = lineNumList.get(i);
- //查询是否已经使用,当前之前
- if(findHasValue(soduku,m,i,num)){
- //将当前添加到最后
- lineNumList.add(lineNumList.remove(i));
- i--;
- if(currentCount > lineNumList.size()){ //数据不符合
- m--; //重新来
- break;
- }
- currentCount ++;
- continue;
- }
- //交换与之后的
- changeValue(soduku,m,i,num);
- }
- // System.out.println(m + " ## " + lineNumList);
- // print(soduku);
- }
- }
- private static void changeValue(int[][] soduku, int currentRow, int currentCols, int num) {
- int endRow = (currentRow / 3 + 1) * 3;
- int endCols = (currentCols / 3 + 1) * 3;
- for(int i = currentRow ; i < endRow ; i ++){
- int startCols = currentCols / 3 * 3;
- if(i == currentRow){
- startCols = currentCols;
- }
- for(int j = startCols ; j < endCols ; j ++){
- int temp = soduku[i][j];
- if(temp == num){
- soduku[i][j] = soduku[currentRow][currentCols];
- soduku[currentRow][currentCols] = temp;
- }
- }
- }
- }
- /**
- * 查询当前的之前是否使用过num
- * @param soduku
- * @param currentRow
- * @param currentCols
- * @param num
- * @return
- */
- private static boolean findHasValue(int[][] soduku, int currentRow, int currentCols, int num) {
- return findAreaValue(soduku, currentRow, currentCols, num)
- || findRowValue(soduku, currentRow, currentCols, num)
- || findColsValue(soduku, currentRow, currentCols, num);
- }
- /**
- * 当前行查询
- * @param soduku
- * @param currentRow
- * @param currentCols
- * @param num
- * @return
- */
- private static boolean findRowValue(int[][] soduku, int currentRow, int currentCols, int num) {
- for(int i = 0 ; i < currentCols ; i++ ){
- int exists = soduku[currentRow][i];
- if(exists == num ){
- return true;
- }
- }
- return false;
- }
- /**
- * 当前列查询
- * @param soduku
- * @param currentRow
- * @param currentCols
- * @param num
- * @return
- */
- private static boolean findColsValue(int[][] soduku, int currentRow, int currentCols, int num) {
- for(int i = 0 ; i < currentRow ; i ++){
- int exists = soduku[i][currentCols];
- if(exists == num){
- return true;
- }
- }
- return false;
- }
- /**
- * 当前区域查询
- * @param soduku
- * @param currentRow
- * @param currentCols
- * @param num
- * @return
- */
- private static boolean findAreaValue(int[][] soduku, int currentRow, int currentCols, int num) {
- //currentRow 1 currentCols 5
- int startRow = currentRow / 3 * 3; //3
- int startCols = currentCols / 3 * 3;
- for(int i = startRow ; i <= currentRow ; i ++ ){ // 345
- int cols = startCols + 3;
- if(i == currentRow){
- cols = currentCols;
- }
- for(int j = startCols ; j < cols ; j ++) {
- int exists = soduku[i][j];
- if(exists == num){
- return true;
- }
- }
- }
- return false;
- }
- /**
- * 生成数据
- * @param soduku
- */
- private static void getData(int[][] soduku) {
- for(int m = 0 ; m < 9 ; m ++){
- for(int n = 0 ; n < 9 ; n ++){
- soduku[m][n] = (m % 3) * 3 + (n % 3) + 1 ;
- }
- }
- }
- private static List<Integer> lineNumList;
- private static List<Integer> getValueList(){
- Random random = new Random();
- List<Integer> list = new ArrayList<Integer>();
- while(list.size() < 9){
- //保证行数据唯一
- int num = random.nextInt(10);
- if(!list.contains(num) && num > 0){
- list.add(num);
- }
- }
- return list;
- }
- /**
- * 输出
- * @param soduku
- */
- private static void print(int[][] soduku) {
- for(int m = 0 ; m < 9 ; m ++){
- for(int n = 0 ; n < 9 ; n ++){
- System.out.print(soduku[m][n]);
- if( ( (n + 1) % 3 == 0 ) && n < 8 ){
- System.out.print(" | ");
- }
- }
- if( ( (m + 1) % 3 == 0 ) && m < 8){
- System.out.println();
- for(int i = 0 ; i < 15 ; i ++){
- System.out.print("-");
- }
- }
- System.out.println();
- }
- System.out.println("#############");
- }
- }
相关推荐
本篇将深入讲解Java版的数独解算算法。 首先,我们需要创建一个表示数独盘面的数据结构。在Java中,我们可以使用二维数组来实现,每个元素代表一个格子,值为0表示为空,其他1-9的整数代表已填入的数字。此外,为了...
本项目是一个用Java实现的数独算法,结合了一个用户界面,便于玩家交互。 在Java中实现数独算法,通常涉及以下关键点: 1. **数据结构设计**:首先,我们需要一个数据结构来存储数独的当前状态。这通常是一个二维...
1. **Java基础知识**: - 类与对象:数独游戏的实现肯定涉及到多个类,如SudokuGrid(数独网格)、Cell(单元格)、Solver(解谜器)等。每个类都代表一个具体的实体或概念,而对象则是这些类的实例。 - 异常处理...
最后,对于初学者来说,理解并实现这个项目可以帮助他们掌握Java编程基础,锻炼逻辑思维和问题解决能力,尤其是回溯法这一重要的算法思想。通过不断调试和完善代码,可以提升对算法的理解和应用水平。同时,这个项目...
下面我们将深入探讨数独游戏的基本规则、Java编程基础以及如何用Java来实现数独算法。 首先,理解数独的规则至关重要。数独的9x9大网格被划分为9个3x3的子宫,每个子宫内必须填入1到9的数字,且每个数字在同一行、...
通过这个项目,开发者可以学习到Java编程基础,如类的设计、文件操作、GUI编程,以及问题解决和算法实现的技巧。同时,对于初学者来说,这也是一个很好的实践项目,能够提升他们的编程能力和逻辑思维。
Java实现的数独九宫格算法是一个典型的编程挑战,它涉及到逻辑推理、回溯和效率优化等技术。数独是一种基于数字填充的逻辑游戏,玩家需要在9x9的网格中填入数字,使得每行、每列以及每个3x3的小宫格内的数字都不重复...
1. **基础算法**:数独求解器通常采用回溯法或者基于约束满足问题(Constraint Satisfaction Problem, CSP)的算法。回溯法是一种试探性的解决问题方法,当遇到冲突时会撤销最近的选择并尝试其他可能性;CSP则涉及到...
Java数独小游戏源代码是一个...通过这个项目,开发者不仅可以巩固Java编程基础,还能深入理解面向对象设计、图形用户界面开发、算法应用等多个重要编程概念。同时,项目实战有助于提高问题解决能力和软件工程实践能力。
1. **Java基础**:首先,开发者需要熟悉Java的基本语法、类结构和面向对象编程概念。数独游戏的核心逻辑会封装在类中,每个类可能代表游戏的界面、数独盘面、规则验证等不同部分。 2. **图形用户界面(GUI)**:...
综合以上,Java数独计算器是一个集成了多种算法和技术的程序,它不仅能够解决数独问题,还能通过优化策略提高求解速度,为用户提供高效的数独解算体验。通过学习和理解这个项目,开发者可以深入掌握回溯法、搜索算法...
《Java-C-JS数据结构与算法合集》是针对编程领域的三大主流语言——Java、C和JavaScript,深入探讨数据结构与算法的宝贵资源。数据结构是计算机存储、组织数据的方式,而算法是解决问题的精确步骤,它们是软件开发的...
Java基础编程练习题和经典算法是提升编程技能和准备面试的关键环节。这50题的基础编程练习涵盖了Java语言的核心概念,如数据类型、控制结构、类与对象、异常处理、集合框架等,旨在帮助学习者巩固基础知识并提高编程...
总的来说,这个Java程序提供了一个基础的数独矩阵生成器,它展示了如何用编程语言实现一种特定的数字排列方式。如果你想要开发一个完整的数独游戏,还需要增加逻辑来生成合法的数独谜题,以及让用户交互解决谜题的...
1. **Java基础知识**:掌握基本数据类型、控制结构、类与对象、继承、多态等核心概念。了解如何组织和设计Java类来实现数独游戏的逻辑。 2. **图形用户界面(GUI)编程**:使用Java的Swing或JavaFX库创建用户友好的...
在实现数独逻辑问题时,我们通常会涉及到算法设计与编程技术,特别是对于Java语言来说。 一、基础概念 1. 数独矩阵:数独问题可以表示为一个9x9的二维数组,其中0代表空格,1到9代表已填入的数字。 2. 难度等级:...
Java数独课程设计是一个典型的基于Java编程语言的项目,它涉及到很多重要的计算机科学概念和技术,尤其是在软件工程和算法设计方面。下面将详细解释这个项目所涵盖的知识点。 1. **Java编程基础**:整个项目是用...
总结来说,这个Java数独程序涵盖了Java编程、数独游戏规则、变形模式设计、回溯算法实现、GUI开发、数据结构设计以及文件操作等多个方面的知识。通过深入学习和理解这些内容,你可以不仅享受到玩数独的乐趣,还能...
数独是一种广受欢迎的逻辑推理...对于初学者,这是一个很好的实践项目,可以帮助他们巩固Java基础知识,理解GUI编程,以及学习如何用算法解决问题。对于有经验的开发者,它可以作为进一步探索JavaFX或优化算法的挑战。