閒來寫寫隨機生成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);
}
}