① 如何快速生成一个数独
不是很难 只要遵守数独的规则需要一个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
不要把谜题解一次列出,而是找出下一步,及他的逻辑推理方法。
不要用猜测。