當前位置:首頁 » 操作系統 » 數獨生成演算法

數獨生成演算法

發布時間: 2023-03-27 13:40:29

❶ 數獨的方法技巧與規律 數獨的方法技巧與規律介紹

1、在空格內填入1~9的任意一個數,使得盤面內,每一行、每一列、每一個正方形粗線九宮格區域內的數字,均包含1到9,不含有重復的數字。

2、唯一睜局盯余數法,簡稱唯余法悉和,是一種某個單元格中被摒除法排除情況後,只剩下1~9的其中某個數字沒有填,從而得到它就是此單元格的值的解法。唯一餘數法也可以適用於僅在同一個單元內部的推理,中文稱之為點演算法(Full House)。

3、區塊排除。這種技巧被稱為區塊摒除法,用區塊排除了行和列的,稱為宮對行列區塊摒除法(臘豎Pointing);而下面這個例子則為行列區塊對宮摒除法(Claiming);而它們各自構成一個區塊(Intersection),例如,單元格組{r1c5, r1c6}就構成一個區塊。

❷ 請問如何隨機生成一個數獨

答:關於這個問題,

數獨(すうどく,Sūdoku)是一種運用紙、筆進行演算的邏輯游戲。玩家需要根據9×9盤面上的已知數字,推理出所有剩餘空格的數字,並滿足每一行、每一列、每一個粗線宮內的數字均含1-9,不重復。

如上圖所示,我需要一個簡單的原型,也就是按照一定規則組成的數獨表,通過一個隨機生成的Map(也就圖中所示的參照表),類似與翻譯似的經過兩次轉換,變成一個看似沒有規則但都繼承了原型表規律的新的數獨表。另外,值得一提的是,這兩衡襪次參照生成並不需要使用同一個Map。

缺陷:這個演算法其實只能算是「偽演算法」,因為他並沒有真正的生成一個隨機的數獨表,只是一種表象上

❸ 跪求生成數獨的演算法

這里講的話字數有限制,還是給樓主你網站吧

數獨計算器

❹ 數獨的計算公式是什麼

數獨的計算公式是每一橫行、每一豎行和每一斜行的和都等於15。

❺ 用C語言如何隨機生成一個數獨

數獨生成演算法?這個還真不好搞,不過我當初寫數獨游戲的時候隨便搗鼓出來過一個,你自己去改改吧,至於這個演算法能不能生成所有的數獨,我還真沒論證過。

原理:對一個給出的數獨棋盤的所有行或列交換給出的兩個數X、Y,或液數組仍滿足數獨規則。如給出1、2,則對所有列交換1、2的位置,數組仍滿足數獨規則。

由於對棋盤的演進是隨機的,所以相當於隨機生攜正成數獨棋盤啦。每衫隱物次演進的次數最好大一點,10次以上吧,以保證每個數都被換過位置。

具體代碼就不用我寫了吧,嘎嘎……

❻ 用C語言如何隨機生成一個數獨

數獨生成演算法?這個還真不好搞,不過我當初寫數獨游戲的時候隨便搗鼓出來過一個,你自己去改改吧,至於這個演算法能不能生成所有的數獨,我還真沒論證過。

原理:對一個給出的數獨棋盤的所有行或列交換給出的兩個數X、Y,數組仍滿足數獨規則。如給出1、2,則對所有列交換1、2的位置,數組仍滿足數獨規則。

由於對棋盤的演進是隨機的,所以相當於隨機生成數獨棋盤啦。每次演進的次數最好大一點,10次以上吧,以保證每個數都被換過位置。

具體代碼就不用我寫了吧,嘎嘎……

❼ 如何快速生成一個數獨

不是很坦罩和難 只要遵守數獨的規則需要一個9x9的數組 如 int a[9][9];每個數只會出現9次 這是一個限制 然後按照順序一個數一個數的往小方陣里放放數的時候的規則有三個1. 同一個數在每個3x3小方陣悶李里只能放一次 取隨機位置2. 同一個數在行中只能出現一次 這樣一行中出現的數字就是1234567893. 列和行是一個道理最後你可以隨機抽掉讓盯一部分的數 (抽掉的越多 就代表越難) 一盤數獨就生成好了

❽ 數獨演算法思路

數獨(數和)(英: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;
}

看完這些,你對數獨的演算法了解了嗎?

❾ 數獨演算法

給你數獨計算器:
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
不要把謎題解一次列出,而是找出下一步,及他的邏輯推理方法。
不要用猜測。

❿ 數獨計算方法

對於數獨游戲的解法,通常採用"直觀法(Direct Elimination Techniques)" 和 "候選數法(Candidates Elimination Techniques)".

直觀法(Direct Elimination Techniques),顧名思義,就是通過對謎題中現有的數字進行分析,繼而逐一確定剩餘空格中的數字的方法。它是最常用並且相對簡單的方法,對於比較容易的謎題,可以快速求解並收到良好的效果。但是遇到比較復雜的題目,直觀法(Direct Elimination Techniques)就稍顯力不從心了。
候選數法(Candidates Elimination Techniques), 是先在所有空白的單元格中春肆毀寫上所有可能出現的數字,然後通過一些常用的演算法來刪減候選數,最雹滲終獲得唯一確定扒備的候選數。候選數法(Candidates Elimination Techniques)被廣泛使用在電腦生成謎題及解題的實踐中,這不僅因為它編程相對容易,而且它的演算法也在不斷增加,使它的解題效率和能力都得以大力提高。

熱點內容
如何修改老式電腦鎖屏密碼 發布:2024-03-19 16:32:15 瀏覽:395
上面是資料庫 發布:2024-03-19 16:21:46 瀏覽:194
演算法lD3 發布:2024-03-19 16:17:06 瀏覽:842
t61電腦什麼配置嗎 發布:2024-03-19 15:59:58 瀏覽:615
安卓鍵盤哪個好 發布:2024-03-19 15:42:43 瀏覽:894
我的世界子軒伺服器名字 發布:2024-03-19 15:41:49 瀏覽:111
存儲過程優化批量插入 發布:2024-03-19 15:20:14 瀏覽:122
怎樣安裝ftp伺服器 發布:2024-03-19 15:19:19 瀏覽:484
上海編譯分布式存儲晶元 發布:2024-03-19 15:18:32 瀏覽:325
linux簡訊 發布:2024-03-19 14:50:57 瀏覽:930