生成一个随机的数独

之前有同事想起要做一个数独,然后我也挺喜欢玩这个游戏的,然后就想也做一个,同事提出的想法是做一个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();
        }
    }

}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值