当前位置:首页 » 操作系统 » 数独生成算法

数独生成算法

发布时间: 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)被广泛使用在电脑生成谜题及解题的实践中,这不仅因为它编程相对容易,而且它的算法也在不断增加,使它的解题效率和能力都得以大力提高。

热点内容
安卓什么功能好 发布:2025-05-11 18:21:31 浏览:354
我的世界2b2t服务器中国版 发布:2025-05-11 18:16:35 浏览:692
萌将风云脚本 发布:2025-05-11 18:07:14 浏览:745
密码锁aid代表什么 发布:2025-05-11 18:00:01 浏览:756
编程的组成 发布:2025-05-11 17:58:34 浏览:808
火山易语言apk反编译 发布:2025-05-11 17:52:01 浏览:814
钢琴密码锁本的密码该在哪里看 发布:2025-05-11 17:49:44 浏览:468
in运算法则 发布:2025-05-11 17:41:32 浏览:406
微信怎么分身两个账号安卓 发布:2025-05-11 17:32:14 浏览:915
新人采访问题 发布:2025-05-11 17:14:29 浏览:899