Java隨機生成數讀盤

閒來寫寫隨機生成9*9的數讀盤。

寫的可能一般,有優秀的可以共享給我。

package com.touchmain.sudu;

import java.util.HashSet;
import java.util.Set;

/**
 * Created by crab on 2019/5/17.
 */
public class SuduMain {

    public static final int [] num = {1,2,3,4,5,6,7,8,9};
    public static int [][] result = new int[9][9];


    /**
     * 輸出結果
     */
    public static void printResult(){
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                System.out.print(" "+result[i][j]+" ");
            }
            System.out.println();
        }
    }

    /**
     * 生成隨機數
     */
    public static int generateRandomNum(){
        //填寫生成規則
        int index = (int) (Math.random() * num.length);
        return num[index];
    }
    public static int count = 0;

    /**
     * 填入隨機數
     * @param
     */
    public static boolean inputNum(){
        //y軸
        for (int y = 0; y < 9; y++) {
            //x軸
            for (int x = 0; x < 9; x++) {
                count++;
                //從0,0算
                if(y==0 && x==0) {
                    result[y][x] = generateRandomNum();
                }else{
                    //從第二位起判斷重複
                    int num = generateRandomNum();
                    if (x > 0 && checkXNum(num,y,x)) {
                       //重新生成
                        x--;
                        continue;
                    }

                    //如果Y軸存在重複則重生成該值並重置當前行
                    if(y > 0 && checkYNum(num,y,x)){
                        result[y][x] = 0;
                        //清除當前一整行
                        clearArgs(y);
                        y--;
                        break;
                    }
                    //直接賦值
                    result[y][x] = num;
                    //九宮規則
                    if(y > 0 && (x+1)%3==0 &&(y+1)%3==0 && checkNineSpace(y,x)){
                        //清除當前一整行
                        clearArgs(y);
                        clearArgs(y-1);
                        y = y - 2;
                        break;
                    }

                }
            }

        }
        return true;
    }

    /**
     * 判斷九宮是否存在重複數字
     * @param x
     * @param y
     * @return
     */
    private static boolean checkNineSpace(int y, int x) {
       // System.out.println("y:"+y+"x:"+x+"九宮點:"+result[y][x]);
        Set<Integer> nine = new HashSet<>();
        for (int j = 0; j < 3; j++) {
            for (int i = 0; i <3; i++) {
                nine.add(result[y-i][x-j]);
            }
        }
        if(nine.size()<9){
            return true;
        }
        return false;
    }

    /**
     * 清除單行
     * @param i
     */
    public static void clearArgs(int i){
            for (int k = 0; k < 9 ; k++) {
                result[i][k]=0;
            }
    }

    /**
     * 校驗X軸數字
     * @param num
     * @return
     */
    public static boolean checkXNum(int num,int i,int j){
        for (int k = 0; k <j ; k++) {
            if(result[i][k]==num){
                return true;
            }
        }
        return false;
    }

    /**
     * 校驗Y軸數字
     * @param num
     * @return
     */
    public static boolean checkYNum(int num,int y,int x){
        for (int k = 0; k < y ; k++) {
            if(result[k][x]==num){
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        inputNum();
        printResult();
        System.out.println("總共循環次數:"+count);
    }






}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章