编程-java 菜鸟求助 求各路大神指教 九宫格如何填数? 需求如下

问题描述

java 菜鸟求助 求各路大神指教 九宫格如何填数? 需求如下

/**

  • 打印一个 9*9 的九宫格
  • 必须满足一下两个条件
  • 条件1: 任意一行或者一列都满足9个不同的数字
  • 条件2: 任意一个小9格正方形都满足9个不同的数字
  • 思想: 通过设定满足条件 无限次循环生成任意数字的矩阵 直到满足后跳出循环
  • 结果失败
  • */

解决方案

package com;

import java.util.Random;

public class ShuDu {

/** 存储数字的数组 /

private static int[][] n = new int[9][9];

/* 生成随机数字的源数组,随机数字从该数组中产生 */

private static int[] num = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

public static int[][] generateShuDu(){
    // 生成数字
    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--;
            }
        }
    }
    return n;
}  

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

/**
 * 检查行是否符合要求
 *
 * @param row
 *            检查的行号
 * @return true代表符合要求
 */
private 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代表符合要求
 */
private 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代表符合要求
 */
private 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
 */
private static Random r=new Random();
private 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));//j2se

int ranNum=r.nextInt(9 - time);//j2me

// 把数字放置在数组倒数第time个位置,

int temp = num[8 - time];

num[8 - time] = num[ranNum];

num[ranNum] = temp;

// 返回数字

return num[8 - time];

}

public static void main(String[] args) {
    int[][] shuDu=generateShuDu();
    // 输出结果
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            System.out.print(shuDu[i][j] + " ");
        }
        System.out.println();
    }
}

}

解决方案二:

明白了 退回机制 和 每次循环剔除前面存在的数字 把0不作为比较变量 以及没生成一个数字对条件验证一遍 非常感谢 求多莅临指导

时间: 2024-12-03 05:20:01

编程-java 菜鸟求助 求各路大神指教 九宫格如何填数? 需求如下的相关文章

急求各路大神指教,太菜没办法~ 求各路大神帮我实现以下贴内功能~小弟感激不尽~

问题描述 功能需求是这样的:这是数据库表名和字段ID返利明细IDUserID用户名IDInviterId邀请人IDOrderID订单IDStatus状态IDReturnAmount返回金额ID这是页面静态效果图:我需要的功能是点击提交按钮的时候把状态改变掉,如果1和2代表的是可提现,点击提现按钮的时候变成已提现,并且显示中文,数据提交到数据库.请大神们指教一下,用什么方法比较好.这是静态页面代码: 解决方案 本帖最后由 Xrj0053 于 2015-01-14 10:03:38 编辑解决方案二:

php编程-php中的面向对象问题,求各路大神解答啊!

问题描述 php中的面向对象问题,求各路大神解答啊! php中的面向对象..类里边的成员属性到底是干嘛的?..类里边的方法最终只是为了给属性赋值吗????各路大神告诉我啊..求解答..感激不尽.. 解决方案 比如Person这个类,它有name,age,gendar等成员属性,它还有say()这个方法,方法就是它要执行的动作. <?php class Person { private $name; private $age; private $gendar; // 这里是一个构造方法,需要传入三

编程c语言-求助!菜鸟一枚 请大神指教!

问题描述 求助!菜鸟一枚 请大神指教! 请问用c语言怎么计算校验和?能将带有汉字的文件读入然后计算?过程怎么写!好着急啊! 解决方案 文件不管有没有汉字,都当作二进制数据.校验和还分为不同位数的. 具体要看对方协议的要求 仅供参考:http://download.csdn.net/detail/captain_black/679608 解决方案二: 1.中文字符串可以使用printf().puts()等函数直接输出.#include #include int main(){ const char

java-命令行无法运行jar!!!超集,求各路大神赐教

问题描述 命令行无法运行jar!!!超集,求各路大神赐教 由于课程需要下载的一个jar文件,windows命令行下运行老是显示如下错误: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at sun.awt.shell.win32ShellFolder2.getFileSystemPath..... 作业deadline就要到了,十万火急!!求大神帮忙!! 解决方案 已经运行了,但是代码中出现空

acm-ACM HDU1879继续畅通工程 提交RE.求各路大神帮忙看一下哪儿错了

问题描述 ACM HDU1879继续畅通工程 提交RE.求各路大神帮忙看一下哪儿错了 题目大意: 求最小生成树的权值和,并输出.已经修建的路(已经连上的边)是不会算入到最后的ANS中. Input 测试输入包含若干测试用例.每个测试用例的第1行给出村庄数目N ( 1< N < 100 ):随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建. 当N为0时输入结束. Samp

oracle-急求各路大神关于Oracle和JSP页面字符集转换的问题

问题描述 急求各路大神关于Oracle和JSP页面字符集转换的问题 我用的是Oracle11g,编码方式为ZHS16GBK,开发工具是myeclipse,JSP页面用的是utf-8,我现在想向数据库插入一条数据,其中有中文字符,我想问一下怎么转换这个字符,使其在数据库中能正常显示,而不是乱码 解决方案 好吧,服务器的配置问题,已经解决了 解决方案二: http://xiangqinghu1988.blog.163.com/blog/static/58822991201222231517193/

方法-求各路大神们帮帮小弟,Win7多用户远程登录

问题描述 求各路大神们帮帮小弟,Win7多用户远程登录 我利用Windows自身的mstscax.dll控件实现了远程桌面连接,和windows本身的mstsc.exe功能是一样的,现在遇到个问题,我远程连接别的电脑,被控端就被踢掉了,如何实现我启动远程连接,而被控端正常操作呢?试了一些在网上查询的win7多用户远程登录的方法,但是没用,求各路大神们帮帮小弟,谢谢啦!!! 解决方案 周末的时候,我下载到了相应的补丁,在我的电脑上成功实现同时在线.我把补丁文件上传到了下载频道,0积分下载,你可以下

代码-求帮助,求各路大神指点一下!!!

问题描述 求帮助,求各路大神指点一下!!! 求各路大神帮忙看看这个代码问题出在哪里,为什么运行的时候会什么都没有呢... #include #include #include #include using namespace std;int main(){ int count(0); const int MAX_SIZE = 20; int x[MAX_SIZE]; double y[MAX_SIZE]y_est[MAX_SIZE]diff_est[MAX_SIZE]diff_avg[MAX_S

不胜感激-C++问题,菜鸟求助,望大神解救

问题描述 C++问题,菜鸟求助,望大神解救 #include using namespace std; #define MAXSIZE 10 template class List { public: List(T *elem); bool ListInsert(T elem); bool ListDelete(); bool ListClear(); bool GetElem(T elem); void Traverse(); private: typedef struct LNode { T