求助 生成乙個16 16數獨終盤

2021-06-09 22:50:23 字數 1183 閱讀 5486

我想在一秒內生成乙個16*16數獨的終盤。(終盤就是16*16都填滿了,又符合每行每列每宮包含1,2,...16這些數) 當然是隨機生成,如果構造乙個我1ms就能造乙個,還能造一堆。就是說隨機生成乙個終盤(這裡不作嚴格要求:生成的那乙個終盤是理論上有可能的任乙個)。不需要如此嚴格的要求。只要1m內能生成乙個隨機的16*16終盤,而這個終盤的題庫又大到專家不可能推出來)。實際上你可以完全構造乙個16*16終盤,讓後做乙個對映1,2,...16變成16,15,...1,這裡舉得對映只是16!的一種。換句話說你構造乙個終盤就等於構造了16!個不同的形式不一實質一樣的終盤,這只是做了個對映,其實還可以做很多變換,變成形式不一本質一樣的終盤。我要的不是這樣的東西。我要的是1m內確實能從本質不一樣的海量理論可能中生成乙個終盤就行。

我用乙個演算法生成9*9終盤,1ms乙個,可是做16*16乙個小時也生成不了乙個。我的演算法生成的乙個終盤是形式上,本質上理論上所有可能中隨機生成乙個,如果是開發遊戲,這個題庫就相當大了。大到什麼程度我給你大約算下。以9*9為例:假如我們構造乙個終盤,先在第一行確定1所在位置,然後在第二行確定2所在位置,一次類推最後在第九行確定9所在位置,至此確定了九個數的位置。算下有多少種可能,9的9次方,大約3億。我只確定了9個數的位置還有72個位置沒填數,你想想最後的終盤可能數是多少。

#include

#include

#include

#include

#include

#define  k   4

using namespace std;

int table[k*k][k*k];

void shuffle(int arr)

} bool test(int x, int y, int v)

int main()

} if(i==k*k && y>0)

} else if(i==k*k && y==0)

} }

/*for(int i=0;i<=8;i++)

for(int j=0;j<=8;j++)

table[i][j]=0;*/

//num++;

//}while(num<1000);

for(int x=0;x<=k*k-1;x++)

time1=clock()-time1;

cout<<"use time "

數獨的隨機終盤生成函式設計

首先,我採用的策略是隨機生成終盤,而不是由乙個終盤排列組合出100w個 所以我又得滿足隨機性與時間的要求了。在動手前,我去網上搜了一些數獨終盤的生成函式,發現大體上有兩種演算法 1.每格都在可能的數中隨機生成,如果碰見沒數可填的地方,就把該行或者是更多的指定的格仔刪除,再隨機的跑一遍。每格地方都設定...

寫乙個數獨計算器

終於有點閒暇的時間,翻翻以前的 突然看到有個好久以前寫的數獨計算器,一邊感嘆時光飛逝,一邊心中默默的噴自己 這些年都把自己糟蹋了。不扯了,老習慣,放在最後了,先上圖 特點 1.視覺化計算方式,可以單步執行也可以,也可以全部快速計算 2.提供同值檢測功能,高亮提醒輸入的錯誤值 3.提供計算解釋日誌功能...

利用隨機數編寫的乙個數獨

include include include int a 9 b 9 int c 9 設計思想是從t位置開始,重新設計陣列,t 9儲存在乙個陣列的前面部分,1 t 1儲存在後面部分,這樣來構成乙個序列,並且只要首元素不重複,這個序列的每一位就不會跟上面的序列重複。t有兩種 一種是因為剛好當前行數 ...