生成一個隨機的數獨

之前有同事想起要做一個數獨,然後我也挺喜歡玩這個遊戲的,然後就想也做一個,同事提出的想法是做一個49*49的數獨
我目前還沒弄出來,目前的跑出來的已被驗證過的只有1-12這個區間的數獨。13級以上理論上能跑出來,不過這個方法是真的很笨。先記錄下來,以後在改進。主要是可能過段時間又忘了,莫得事情可能會刪電腦上的代碼~~~

package com.cc.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

    ArrayList<Integer> yforx ;
    ArrayList<Integer>yforall ;
    int[][] container;
    int count = 9;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
            juzheng(count);

    }

    /**
     * 這個方法很笨,而且耗時,實際上number在1-12之間能運行出來,13以後耗時非常長,所以肯定不能用。
     * 必須優化方法。
     * @param size
     */

    public  void juzheng(int size) {
        container = new int[size][size];
        for (int i=0;i<size;i++){
            //num is the number to juzhen
            int num = i+1;
            //壓入之前將每個填入數字的縱座標更新
            yforall = new ArrayList<>();
            //拿到本次壓入數據後,循環每一列,將即將壓入的數據填寫到它可以填入的位置,每列一個
            for (int j=0;j<size;j++){
                yforx = new ArrayList<>();
                //獲取每列可以填入的位置j爲行數
                for (int k=0;k<size;k++){
//                    System.out.println(num+"找到的空的縱座標是:"+k);
                    if (container[j][k]==0&&!yforall.contains(k)){//如果是初始數字並且在yforall中沒有那麼就是可以填的空
                        yforx.add(k);
//                        System.out.println(num+"找到的空的縱座標是:"+k);
                    }
                }

                //從可以填入的列裏面隨機找一個位置填入數字number
                if (yforx.size()!=0){
                    int position = getPosition();
                    yforall.add(position);
                    container[j][position]=num;

                }
            }
//            printJz();


        }

      printJz();
    }

    public int getPosition(){
        int size = yforx.size();
        if (size!=0){
            int nextInt = new Random().nextInt(size);
            Integer integer = yforx.get(nextInt);
            yforx.remove(nextInt);
            return integer;

        }
        return 100;
    }

    public void printJz(){
        System.out.println("----------------");
        for (int[] ints : container) {
            for (int j = 0; j < container.length; j++) {
                System.out.print(ints[j]+"  ");
                if (ints[j]==0){
                    juzheng(count);
                    return;
                }
            }
            System.out.println();
        }
    }

}

在這裏插入圖片描述

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