之前有同事想起要做一個數獨,然後我也挺喜歡玩這個遊戲的,然後就想也做一個,同事提出的想法是做一個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();
}
}
}