程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> 編程-java 菜鳥求助 求各路大神指教 九宮格如何填數? 需求如下

編程-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();  
    }  
}  

}

javaYcode
javaYcode
MTEN1
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved