① 如何快速生成一個數獨
不是很難 只要遵守數獨的規則需要一個9x9的數組 如 int a[9][9];每個數只會出現9次 這是一個限制 然後按照順序一個數一個數的往小方陣里放放數的時候的規則有三個1. 同一個數在每個3x3小方陣里只能放一次 取隨機位置2. 同一個數在行中只能出現一次 這樣一行中出現的數字就是1234567893. 列和行是一個道理最後你可以隨機抽掉一部分的數 (抽掉的越多 就代表越難) 一盤數獨就生成好了
② 請問如何隨機生成一個數獨
答:關於這個問題,
數獨(すうどく,Sūdoku)是一種運用紙、筆進行演算的邏輯游戲。玩家需要根據9×9盤面上的已知數字,推理出所有剩餘空格的數字,並滿足每一行、每一列、每一個粗線宮內的數字均含1-9,不重復。
如上圖所示,我需要一個簡單的原型,也就是按照一定規則組成的數獨表,通過一個隨機生成的Map(也就圖中所示的參照表),類似與翻譯似的經過兩次轉換,變成一個看似沒有規則但都繼承了原型表規律的新的數獨表。另外,值得一提的是,這兩次參照生成並不需要使用同一個Map。
缺陷:這個演算法其實只能算是「偽演算法」,因為他並沒有真正的生成一個隨機的數獨表,只是一種表象上
③ 用C語言如何隨機生成一個數獨
數獨生成演算法?這個還真不好搞,不過我當初寫數獨游戲的時候隨便搗鼓出來過一個,你自己去改改吧,至於這個演算法能不能生成所有的數獨,我還真沒論證過。
原理:對一個給出的數獨棋盤的所有行或列交換給出的兩個數X、Y,數組仍滿足數獨規則。如給出1、2,則對所有列交換1、2的位置,數組仍滿足數獨規則。
由於對棋盤的演進是隨機的,所以相當於隨機生成數獨棋盤啦。每次演進的次數最好大一點,10次以上吧,以保證每個數都被換過位置。
具體代碼就不用我寫了吧,嘎嘎……
④ 數獨是如何計算的
數獨用到計算的就是「45法則」:
每行的數字和=45
每列的數字和=45
每宮的數字和=45
有以下幾個方法
聯除法:在並排的三個九宮格中的兩排尋找相同數字,再利用九宮格得出另一排中該數字位置,該方法適用於中高級數獨
巡格法:找出在每個九宮格中出現頻率較高的數字,得出該數字在其餘九宮格內位置,該方法應用於方法一之後.
排它法:這個方法是解決問題的關鍵,易被常人所忽略.在各行列或九宮格中觀察,若有個位置其它數字都不能填,就填餘下的數字
待定法:此方法不常用卻很有效.暫時確定某個數字在某個區域,再利用其來進行排除
假設法:即在某個位置隨機的填上一個數字,再進行推演,並有可能最終產生矛盾而否定結論行列法:此方法用於收官階段,利用先從行列突破來提高解題效
頻率法:這種方法相比於上一種方法更能提高效率.在某一行列或九宮格列舉出所有情況,再選擇某位置中出現頻率高的數字。
⑤ 九宮數獨怎麼算
九宮格的計算口訣:二、四為肩, 六、八為足。 上九下一, 左七右三
舉個例子:15、-12、-9、-6、-3、0、3、6、9
因為這組數的差是一樣的,因此可以給他們編號-15、-12、-9、-6、-3、0、3、6、9可以分別為①、②、③、④、⑤、⑥、⑦、⑧、⑨
這樣就變成我們平時所用的簡單九宮格了,根據口訣:2、4為肩,6、8為腳5為中的口訣,可以推出:
②⑨④
⑦⑤③
⑥①⑧
再把序號變成原數字,就得到答案:
-12、3、0
9 、-3、-15
-6、-9、6
九宮格數獨口訣:
第一招:三星分軌——先看右下和右中兩個小九宮格中,各有一個8,右上的小九宮格中,從右至左,三列中往下看都有8了,所以8必在此宮中最左一列。
而最左一列5和4下只有一個空位,自然必定是8!再看左邊三個小九宮格中,同理,1和3列中均有9,而當中一列最上的九宮格內只有一個空位,是9無疑!同理,左下小九宮格中的4也是如此推理填入。
擴展內容:
九宮格技巧:
聯除法:在並排的三個九宮格中的兩排尋找相同數字,再利用九宮格得出另一排中該數字位置,該方法適用於中高級數獨
巡格法:找出在每個九宮格中出現頻率較高的數字,得出該數字在其餘九宮格內位置,該方法應用於方法一之後.
排它法:這個方法是解決問題的關鍵,易被常人所忽略.在各行列或九宮格中觀察,若有個位置其它數字都不能填,就填餘下的數字
待定法:此方法不常用卻很有效.暫時確定某個數字在某個區域,再利用起來進行排除
假設法:即在某個位置隨機地填上一個數字,再進行推演,並有可能最終產生矛盾而否定結論
行列法:此方法用於收官階段,利用先從行列突破來提高解題效率
頻率法:這種方法相比於上一種方法更能提高效率.在某一行列或九宮格列舉出所有情況,再選擇某位置中出現頻率高的數字。
⑥ 數獨演算法思路
數獨(數和)(英:Cross Sums;日:カックロ)是一種數學智力游戲。數和把填字游戲和數獨巧妙地結合在一起,採用填字游戲式的棋盤,解題時在空格中填上1-9的數字。這種游戲不僅需要邏輯思維能力,還需要一點加法運算。
電腦自動生成數獨游戲的謎題
要得出所有滿足條件的組合確實不是件容易的事情(主要是很多,列印起來很慢) 。但偶們的目標只是每次能得到一個新的組合,然後從格子裡面隨機遮掉一些數字就可以了。所以只需要在解數獨游戲演算法的基礎上稍作修改即可。
所以,演算法的步驟是:
1.往第一行或第一列隨機填1-9的數字
2.調用解數獨演算法得到一個結果
3.每行隨機遮掉1-8個數字。如果需要較大的難度,也可以將1-8改為2-8或3-8,等等。
以下是console工程的代碼:
// sudoku.cpp : 定義控制台應用程序的入口點。
// by superarhow([email protected])
#include "stdafx.h"
#include "conio.h"
#define SUCCESS 1
#define _FAILED 0
/* 地圖類型9*9的char,每個char從0-9,0表示待填 */
typedef char MAPTYPE[9][9];
/* 行數據,同時用作「可能性」數據。如LINETYPE a; 當a[0]為真時表示
當前位置可填1,a[1]為真時表示可填2,以此類推 */
typedef char LINETYPE[9];
typedef void (*ONMAPOKCALLBACK)(MAPTYPE map);
/* 列印地圖 */
void mp_map(MAPTYPE dest)
{
for ( int j = 0; j < 9; j++ )
{
for ( int i = 0; i < 9; i++ )
{
printf("%d ", dest[i][j]);
}
printf("\n");
}
printf("\n");
}
int fill_line(MAPTYPE dest, int line, ONMAPOKCALLBACK callback);
/* 填下一個格子。本行的可能性已在調用前算好,要考慮的是列的可能性和九宮格的可能性 */
/* nums_possible : array (0-8) means possible of number (1-9) */
int fill_pos(MAPTYPE dest, LINETYPE nums_possible, int line, int pos, ONMAPOKCALLBACK callback)
{
if ( pos >= 9 )
{
return fill_line(dest, line + 1, callback);
}
if ( dest[pos][line] != 0 ) return fill_pos(dest, nums_possible, line, pos + 1, callback);
for ( int i = 0; i < 9; i++ )
{
if ( !nums_possible[i] ) continue;
/* 檢查本列是否重復 */
int vetical_failed = 0;
for ( int j = 0; j < 9; j++ )
if ( dest[pos][j] == i + 1 )
{
vetical_failed = 1;
break;
}
if ( vetical_failed ) continue;
/* 檢查九宮格是否重復 */
int nine_failed = 0;
int m = pos / 3;
int n = line / 3;
m *= 3;
n *= 3;
for ( int y = n; y < n + 3; y++ )
{
for ( int x = m; x < m + 3; x++ )
{
if ( dest[x][y] == i + 1 )
{
nine_failed = 1;
break;
}
}
if ( nine_failed ) break;
}
if ( nine_failed ) continue;
/* all ok, try next position */
dest[pos][line] = i + 1;
nums_possible[i] = 0;
if ( fill_pos(dest, nums_possible, line, pos + 1, callback) )
{
/* 本行已全部OK,嘗試下一行 */
if ( fill_line(dest, line + 1, callback) ) return SUCCESS;
/* 下一行失敗,重新嘗試本位置的剩餘可能性 */
}
nums_possible[i] = 1;
dest[pos][line] = 0;
}
return _FAILED;
}
/* 填下一行 */
int fill_line(MAPTYPE dest, int line, ONMAPOKCALLBACK callback)
{
if ( line >= 9 )
{
/* map */
callback(dest);
return SUCCESS;
}
LINETYPE nums;
LINETYPE saveline;
/* calc possibility(for the current line) */
for ( int i = 0; i < 9; i++ ) nums[i] = 1; /* all can be */
for ( int i = 0; i < 9; i++ )
{
char n = dest[i][line];
/* save line */
saveline[i] = dest[i][line];
if ( n != 0 ) nums[n - 1] = 0; /* appears */
}
if ( !fill_pos(dest, nums, line, 0, callback) )
{
/* restore line */
for ( int i = 0; i < 9; i++ ) dest[i][line] = saveline[i];
return _FAILED;
}
return SUCCESS;
}
MAPTYPE g_result;
void on_map_ok(MAPTYPE map)
{
memcpy(g_result, map, sizeof(MAPTYPE));
}
#include "windows.h"
int _tmain(int argc, _TCHAR* argv[])
{
MAPTYPE dest;
memset(dest, 0, sizeof(MAPTYPE));
srand( GetTickCount() );
/* 隨機填充第一行 */
char ch[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for ( int i = 0; i < 9; i++ )
{
int p = rand() % 9;
char t = ch[p];
ch[p] = ch[i];
ch[i] = t;
}
for ( int i = 0; i < 9; i++ ) dest[i][0] = ch[i];
if ( fill_line(dest, 0, on_map_ok) )
{
/* 修剪掉一些塊 */
for ( int i = 0; i < 9; i++ )
{
/* 調整n的取值范圍可改變難度 %6 + 3是比較難的 */
int n = (rand() % 6) + 3;
for ( int j = 0; j < 9; j++ ) ch[j] = j; /* ch: index to erase */
for ( int j = 0; j < 9; j++ )
{
int p = rand() % 9;
char t = ch[p];
ch[p] = ch[i];
ch[i] = t;
}
for ( int j = 0; j < n; j++ ) g_result[ch[j]][i] = 0;
}
mp_map(g_result);
}
getch();
return 0;
}
看完這些,你對數獨的演算法了解了嗎?
⑦ 數獨的計算公式是什麼
對於數獨游戲的解法,通常採用"直觀法(Direct Elimination Techniques)" 和 "候選數法(Candidates Elimination Techniques)".
直觀法(Direct Elimination Techniques),顧名思義,就是通過對謎題中現有的數字進行分析,繼而逐一確定剩餘空格中的數字的方法。它是最常用並且相對簡單的方法,對於比較容易的謎題,可以快速求解並收到良好的效果。但是遇到比較復雜的題目,直觀法(Direct Elimination Techniques)就稍顯力不從心了。
候選數法(Candidates Elimination Techniques), 是先在所有空白的單元格中寫上所有可能出現的數字,然後通過一些常用的演算法來刪減候選數,最終獲得唯一確定的候選數。候選數法(Candidates Elimination Techniques)被廣泛使用在電腦生成謎題及解題的實踐中,這不僅因為它編程相對容易,而且它的演算法也在不斷增加,使它的解題效率和能力都得以大力提高。
做到這些,解決就差不多了。
⑧ 數獨的計算公式是什麼
數獨的計算公式是每一橫行、每一豎行和每一斜行的和都等於15。
⑨ 數獨的計算公式是什麼
數獨用到計算的就是「45法則」:
每行的數字和=45
每列的數字和=45
每宮的數字和=45
而且數獨計算一般只在Killer Sudoku才用,其它形式的題目不用
橫排由上而下分別為 A-I,直排由左至右分別為1-9。
破解公式-1:利用同一排數字及同一九宮格內數字不能重復原則。要特別檢視橫線或直線三個九宮格內,有無兩個相同的數字,就有機會為第三個找到定位。舉例如下:
破解公式-2:注意任何一個九宮格內有直排或橫排,全部空白時,與其他九宮格同一排相關聯的數字,應該會出現在本九宮格的其他位置。舉例如下:
注意F橫排,由於F1-F3為空格,因此同一排的4, 6, 8, 數字,應該會在F1-F3的九宮格內的其他位置,也就是D1, D2, E3位置。由於I2=6, B2=4,E9=4因此D2=8, E3=6,D1=4。
破解公式-3:記得公式-1要經常再度檢查運用,因為有些原有的空格已經出現數字,有機會可在相關空格填入數字。
破解公式-4:現在需要將九宮格內的空格可能數字,與其同一排的數字排除重復。記得要從較少格數作假設,然後在比對排除不可能的數字。(記得要橫格,直格,九宮格互相比對)
一般高難度時,會需要用到5個空格,也就是只有4個數字出現。舉例如下:
H橫排剩餘空格為1, 4, 5, 7而第5直排有4, 5, 7因此H5=1
⑩ 數獨演算法
給你數獨計算器:
http://blog.xunlei.com/web/category.html?uin=mianmiany1978&category_id=143
數獨游戲:
http://blog.xunlei.com/web/category.html?uin=mianmiany1978&category_id=174
數獨演算法:
http://www.puzzle8.com/suku/news.asp
數獨快速入門(上篇)
數獨快速入門(中篇)
數獨快速入門(下篇)
唯一解法
唯一候選數法
隱性三鏈數刪減法
隱性數對刪減法
三鏈列刪減法
區塊刪減法
矩形頂點刪減法
關鍵數刪減法
補充:
合格的數獨是只有唯一解。
而數獨有難易度的分類,找一份報紙注意刊登的數獨謎題是1星,還是5星。
在網路上,更分成容易題、進階題、難題、極難題、超難題....
一般都是依據需要運用的技巧,而技巧是區分難易的。
數獨不用猜測,解題全部是運用邏輯推理。
數獨不用電腦程序分析,就可以解的題目是直觀法數獨題。
而超難題是需要電腦分析,及把全盤標示可選數,那是可選數謎題。
沒有所謂解題通則。
1.直觀解(一般報紙、書籍)
直觀法技巧
直觀法技巧 01 (容易級) 唯一解
直觀法技巧 02 (容易級) 基本摒除
直觀法技巧 03 (進階級) 宮對行列摒除
直觀法技巧 04 (進階級) 行列對宮摒除
直觀法技巧 05 (進階級) 群組解法
直觀法技巧 06 (困難級) X-Wing摒除法01
直觀法技巧 06 (困難級) X-Wing摒除法02
直觀法技巧 07 (困難級) 數偶摒除法
http://hi..com/kiwy07/blog/item/181fc482a153f3bd6c8119ab.html
2.可選數(以程序自動生成可選數)
Last value in block, row or column
Hidden Single in block
Hidden Single in row or column
Direct Pointing
Direct Claiming
Direct Hidden Pair
Naked Single
Direct Hidden Triplet
Pointing
Claiming
Naked Pair, X-Wing, Hidden Pair
Naked Triplet, Swordfish, Hidden Triplet
XY-Wing, XYZ-Wing
Unique rectangles and loops
Naked Quad, Jellyfish, Hidden Quad
Bivalue Universal Graves
Aligned Pair Exclusion
Bidirectioal X-Cycles and Y-Cycles
Forcing X-Chains
Forcing Chains, Bidirectional Cycles
Nishio
Cell/Region Forcing Chains
Dynamic Forcing Chains
http://diuf.unifr.ch/people/juillera/Sudoku/FAQ.html
通則無法解的題
直觀難題
006589307
030602008
809703500
000891403
394265871
180374000
003026785
000458030
008037200
可選數極難題
970000000
003927000
008410709
300700400
060050070
007040003
105074900
000068507
786000042
不要把謎題解一次列出,而是找出下一步,及他的邏輯推理方法。
不要用猜測。