`
参照物
  • 浏览: 12429 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java基础算法--数独

阅读更多

转载自IT学习社区:http://bbs.itcast.cn/thread-6273-1-1.html

作者:梁桐

 

无聊时偶尔会玩一玩益智类游戏。有一种游戏叫“数独”,满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复

shudu.jpg

突发奇想,使用Java基础编写一个自己的获得数独数据小程序。

  1. package cn.itcast;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.Random;
  6.  
  7. public class SudokuTest2 {
  8.  
  9.         public static void main(String[] args) {
  10.                
  11.                 //数组
  12.                 int[][] soduku = new int[9][9];
  13.                 //生成数据
  14.                 getData(soduku);
  15. //                print(soduku);
  16.                 //修改数据
  17.                 changeData(soduku);
  18.                 //打印
  19.                 print(soduku);
  20.                
  21. //                System.out.println(getValueList());
  22.                
  23.         }
  24.  
  25.         private static int currentCount; //当前循环次数
  26.         /**
  27.          * 修改内容
  28.          * @param soduku
  29.          */
  30.         private static void changeData(int[][] soduku) {
  31.                 //获得一个数字
  32.                 for(int m = 0 ; m < soduku.length ; m ++){
  33.                         lineNumList =  getValueList(); //随机生成数据
  34.                         //获得一行数据
  35.                         currentCount = 0;
  36.                         for(int i = 0 ; i < lineNumList.size() ; i ++){
  37.                                 int num = lineNumList.get(i);
  38.                                 //查询是否已经使用,当前之前
  39.                                 if(findHasValue(soduku,m,i,num)){
  40.                                         //将当前添加到最后
  41.                                         lineNumList.add(lineNumList.remove(i));
  42.                                         i--;
  43.                                         if(currentCount > lineNumList.size()){ //数据不符合
  44.                                                 m--; //重新来
  45.                                                 break;
  46.                                         }
  47.                                         currentCount ++;
  48.                                         continue;
  49.                                 }
  50.                                 
  51.                                 //交换与之后的
  52.                                 changeValue(soduku,m,i,num);
  53.                         }
  54. //                        System.out.println(m + " ## " + lineNumList);
  55. //                        print(soduku);
  56.                 }
  57.                
  58.                
  59.                
  60.                
  61.                
  62.         }
  63.  
  64.         private static void changeValue(int[][] soduku, int currentRow, int currentCols, int num) {
  65.                 int endRow = (currentRow / 3 + 1) * 3;
  66.                 int endCols = (currentCols / 3 + 1) * 3;
  67.                 for(int i = currentRow ; i < endRow ; i ++){
  68.                         int startCols = currentCols / 3 * 3;
  69.                         if(i == currentRow){
  70.                                 startCols = currentCols;
  71.                         }
  72.                         for(int j = startCols ; j < endCols ; j ++){
  73.                                 int temp = soduku[i][j];
  74.                                 if(temp == num){
  75.                                         soduku[i][j] = soduku[currentRow][currentCols];
  76.                                         soduku[currentRow][currentCols] = temp;
  77.                                 }
  78.                         }
  79.                 }
  80.         }
  81.  
  82.         /**
  83.          * 查询当前的之前是否使用过num
  84.          * @param soduku
  85.          * @param currentRow
  86.          * @param currentCols
  87.          * @param num
  88.          * @return
  89.          */
  90.         private static boolean findHasValue(int[][] soduku, int currentRow, int currentCols, int num) {
  91.                 return findAreaValue(soduku, currentRow, currentCols, num)
  92.                         || findRowValue(soduku, currentRow, currentCols, num)
  93.                         || findColsValue(soduku, currentRow, currentCols, num);
  94.         }
  95.         
  96.         /**
  97.          * 当前行查询
  98.          * @param soduku
  99.          * @param currentRow
  100.          * @param currentCols
  101.          * @param num
  102.          * @return
  103.          */
  104.         private static boolean findRowValue(int[][] soduku, int currentRow, int currentCols, int num) {
  105.                 for(int i = 0 ; i < currentCols ; i++ ){
  106.                         int exists = soduku[currentRow][i];
  107.                         if(exists == num ){
  108.                                 return true;
  109.                         }
  110.                 }
  111.                 return false;
  112.         }
  113.         
  114.         /**
  115.          * 当前列查询
  116.          * @param soduku
  117.          * @param currentRow
  118.          * @param currentCols
  119.          * @param num
  120.          * @return
  121.          */
  122.         private static boolean findColsValue(int[][] soduku, int currentRow, int currentCols, int num) {
  123.                 for(int i = 0 ; i < currentRow ; i ++){
  124.                         int exists = soduku[i][currentCols];
  125.                         if(exists == num){
  126.                                 return true;
  127.                         }
  128.                 }
  129.                 return false;
  130.         }
  131.         
  132.         /**
  133.          * 当前区域查询
  134.          * @param soduku
  135.          * @param currentRow
  136.          * @param currentCols
  137.          * @param num
  138.          * @return
  139.          */
  140.         private static boolean findAreaValue(int[][] soduku, int currentRow, int currentCols, int num) {
  141.                 //currentRow 1  currentCols 5
  142.                 int startRow = currentRow / 3 * 3;  //3
  143.                 int startCols = currentCols / 3 * 3;
  144.                 for(int i = startRow ; i <= currentRow ; i ++ ){  // 345
  145.                         int cols = startCols + 3;
  146.                         if(i == currentRow){
  147.                                 cols = currentCols;
  148.                         }
  149.                         for(int j = startCols ; j < cols ; j ++) {
  150.                                 int exists = soduku[i][j];
  151.                                 if(exists == num){
  152.                                         return true;
  153.                                 }
  154.                         }
  155.                 }
  156.                 return false;
  157.         }
  158.         
  159.         
  160.  
  161.         /**
  162.          * 生成数据
  163.          * @param soduku
  164.          */
  165.         private static void getData(int[][] soduku) {
  166.                 for(int m = 0 ; m < 9 ; m ++){
  167.                         for(int n = 0 ; n < 9 ; n ++){
  168.                                 soduku[m][n] = (m % 3) * 3 + (n % 3) + 1 ;
  169.                         }
  170.                 }
  171.         }
  172.  
  173.         
  174.         private static List<Integer> lineNumList;
  175.         private static List<Integer> getValueList(){
  176.                 Random random = new Random();
  177.                 List<Integer> list = new ArrayList<Integer>();
  178.                 while(list.size() < 9){
  179.                         //保证行数据唯一
  180.                         int num = random.nextInt(10);
  181.                         if(!list.contains(num) && num > 0){
  182.                                 list.add(num);
  183.                         }
  184.                 }
  185.                 return list;
  186.         }
  187.  
  188.         /**
  189.          * 输出
  190.          * @param soduku
  191.          */
  192.         private static void print(int[][] soduku) {
  193.                 for(int m = 0 ; m < 9 ; m ++){
  194.                         for(int n = 0 ; n < 9 ; n ++){
  195.                                 System.out.print(soduku[m][n]);
  196.                                 if( ( (n + 1) % 3 == 0 ) && n < 8 ){
  197.                                         System.out.print(" | ");
  198.                                 }
  199.                         }
  200.                         if( ( (m + 1) % 3 == 0 ) && m < 8){
  201.                                 System.out.println();
  202.                                 for(int i = 0 ; i < 15 ; i ++){
  203.                                         System.out.print("-");
  204.                                 }
  205.                         }
  206.                         System.out.println();
  207.                 }
  208.                 System.out.println("#############");
  209.         }
  210. }
  211.  
分享到:
评论

相关推荐

    数独算法Java版。(有注释,编译已过)

    本篇将深入讲解Java版的数独解算算法。 首先,我们需要创建一个表示数独盘面的数据结构。在Java中,我们可以使用二维数组来实现,每个元素代表一个格子,值为0表示为空,其他1-9的整数代表已填入的数字。此外,为了...

    shudu.rar_java 数独算法_shudu_数独

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

    java编写的数独游戏

    1. **Java基础知识**: - 类与对象:数独游戏的实现肯定涉及到多个类,如SudokuGrid(数独网格)、Cell(单元格)、Solver(解谜器)等。每个类都代表一个具体的实体或概念,而对象则是这些类的实例。 - 异常处理...

    数独 -Java 版

    最后,对于初学者来说,理解并实现这个项目可以帮助他们掌握Java编程基础,锻炼逻辑思维和问题解决能力,尤其是回溯法这一重要的算法思想。通过不断调试和完善代码,可以提升对算法的理解和应用水平。同时,这个项目...

    数独(java)

    下面我们将深入探讨数独游戏的基本规则、Java编程基础以及如何用Java来实现数独算法。 首先,理解数独的规则至关重要。数独的9x9大网格被划分为9个3x3的子宫,每个子宫内必须填入1到9的数字,且每个数字在同一行、...

    java数独小游戏

    通过这个项目,开发者可以学习到Java编程基础,如类的设计、文件操作、GUI编程,以及问题解决和算法实现的技巧。同时,对于初学者来说,这也是一个很好的实践项目,能够提升他们的编程能力和逻辑思维。

    java 数独 九宫格

    Java实现的数独九宫格算法是一个典型的编程挑战,它涉及到逻辑推理、回溯和效率优化等技术。数独是一种基于数字填充的逻辑游戏,玩家需要在9x9的网格中填入数字,使得每行、每列以及每个3x3的小宫格内的数字都不重复...

    游戏 - 数独 游戏算法 源代码

    1. **基础算法**:数独求解器通常采用回溯法或者基于约束满足问题(Constraint Satisfaction Problem, CSP)的算法。回溯法是一种试探性的解决问题方法,当遇到冲突时会撤销最近的选择并尝试其他可能性;CSP则涉及到...

    java数独小游戏源代码

    Java数独小游戏源代码是一个...通过这个项目,开发者不仅可以巩固Java编程基础,还能深入理解面向对象设计、图形用户界面开发、算法应用等多个重要编程概念。同时,项目实战有助于提高问题解决能力和软件工程实践能力。

    java数独手机小游戏

    1. **Java基础**:首先,开发者需要熟悉Java的基本语法、类结构和面向对象编程概念。数独游戏的核心逻辑会封装在类中,每个类可能代表游戏的界面、数独盘面、规则验证等不同部分。 2. **图形用户界面(GUI)**:...

    java数独计算器

    综合以上,Java数独计算器是一个集成了多种算法和技术的程序,它不仅能够解决数独问题,还能通过优化策略提高求解速度,为用户提供高效的数独解算体验。通过学习和理解这个项目,开发者可以深入掌握回溯法、搜索算法...

    Java-C-JS数据结构与算法合集

    《Java-C-JS数据结构与算法合集》是针对编程领域的三大主流语言——Java、C和JavaScript,深入探讨数据结构与算法的宝贵资源。数据结构是计算机存储、组织数据的方式,而算法是解决问题的精确步骤,它们是软件开发的...

    JAVA基础编程练习题50题及经典算法90题【含源码及答案】-史上最全

    Java基础编程练习题和经典算法是提升编程技能和准备面试的关键环节。这50题的基础编程练习涵盖了Java语言的核心概念,如数据类型、控制结构、类与对象、异常处理、集合框架等,旨在帮助学习者巩固基础知识并提高编程...

    java编写的 数独游戏

    总的来说,这个Java程序提供了一个基础的数独矩阵生成器,它展示了如何用编程语言实现一种特定的数字排列方式。如果你想要开发一个完整的数独游戏,还需要增加逻辑来生成合法的数独谜题,以及让用户交互解决谜题的...

    java毕业设计&课设-数独小游戏.zip

    1. **Java基础知识**:掌握基本数据类型、控制结构、类与对象、继承、多态等核心概念。了解如何组织和设计Java类来实现数独游戏的逻辑。 2. **图形用户界面(GUI)编程**:使用Java的Swing或JavaFX库创建用户友好的...

    数独逻辑问题的实现

    在实现数独逻辑问题时,我们通常会涉及到算法设计与编程技术,特别是对于Java语言来说。 一、基础概念 1. 数独矩阵:数独问题可以表示为一个9x9的二维数组,其中0代表空格,1到9代表已填入的数字。 2. 难度等级:...

    java数独课设.zip

    Java数独课程设计是一个典型的基于Java编程语言的项目,它涉及到很多重要的计算机科学概念和技术,尤其是在软件工程和算法设计方面。下面将详细解释这个项目所涵盖的知识点。 1. **Java编程基础**:整个项目是用...

    java数独(支持普通和变形方式)

    总结来说,这个Java数独程序涵盖了Java编程、数独游戏规则、变形模式设计、回溯算法实现、GUI开发、数据结构设计以及文件操作等多个方面的知识。通过深入学习和理解这些内容,你可以不仅享受到玩数独的乐趣,还能...

    java写的数独程序

    数独是一种广受欢迎的逻辑推理...对于初学者,这是一个很好的实践项目,可以帮助他们巩固Java基础知识,理解GUI编程,以及学习如何用算法解决问题。对于有经验的开发者,它可以作为进一步探索JavaFX或优化算法的挑战。

Global site tag (gtag.js) - Google Analytics