数独怎么做做不出来

数独做出来,能练智商? | 快乐数独小组 | 果壳网 科技有意思
7729人加入此小组
+ 加入我的果篮
智商这种东西能不能靠数独练我不清楚,但是数独可以锻炼一个人的逻辑思维能力,分析能力和空间认知能力,这些如果也被定义到智商里面的话,那答案是yes
数独做出来,能给人带来快乐——成功的喜悦。哈哈
反正就是很有成就感吧,happy~~~
的话:智商这种东西能不能靠数独练我不清楚,但是数独可以锻炼一个人的逻辑思维能力,分析能力和空间认知能力,这些如果也被定义到智商里面的话,那答案是yes+1
看这那么一大片数字,很有成就感的……
成就感这玩意就和高潮一样...
我觉得玩数独锻炼了我的逻辑思维能力,让我可以在和别人聊天时,轻易发现对方说话中的逻辑错误,反应比以前快了
(C)2013果壳网&京ICP备号-2&京公网安备数独究竟有多少种不同的数字排列可能?如何计算结果?最少给出几个数字就能推算一组数独数字表?_百度知道
数独究竟有多少种不同的数字排列可能?如何计算结果?最少给出几个数字就能推算一组数独数字表?
请给出完整清晰的计算过程!谢谢!
1j2i3y4u5 - 见习魔法师二级你所答并非我所问,请你看清问题再做出合适的回答.我想这是一道数学排列组合方面的问题.小弟才疏学浅,请诸位高手不吝赐教,谢谢!
提问者采纳
合格的数独是有解,而解是唯一解 一般是运用回溯演算法,这是试误法,通常是以电脑程序检查。 以人去检查不如程序检查快! 著名的程序是 爱尔兰数学教授麦盖尔 博士(Gary McGuire)的无偿程序 SOLVER.EXE ,计算机专业的学生都可以写的出这个程序,但是程序的执行速度仍有优劣之分。
合格的数独解(Sudoku grids )有 6,670,903,752,021,072,936,960 这是这是贝米耳(Stanley E. Bammel)与罗思坦(Jerome Rothstein)二位数学家计算除来的,有专门研究的报告
由于同一个数独可以变形,例如左右纵列交换、上下横行交换、数字代码交换(例如1和5交换,2和8、3和4...)重复前面几次之后,就分不清是来自同一个数独,但是专家们还是有法子的。 澳大利亚的大学(The University of Western Australia )教授Gordon Royle 博士利用图形理论,发展出辨识数独变形的方法。将数独谜题利用 Nauty 程序图形转化,然后作比对。
如果考虑经过变形的数独不算是新数独,那么数独解的数目会少很多! 这些都是数独专业的研究,有数学、计算机、...等专家们在研究, 特别刊载于专业学报至于如何计算结果,楼上的已经说得差不多了!
提问者评价
其他类似问题
按默认排序
其他1条回答
九宫格数独 是一种源自18世纪末的瑞士,后在美国发展、并在日本得以发扬光大的数学智力拼图游戏。拼图是九宫格(即3格宽×3格高)的正方形状,每一格又细分为一个九宫格。在每一个小九宫格中,分别填上1至9的数字,让整个大九宫格每一列、每一行的数字都不重复。[历史]原来“Sudoku”起源于瑞士,是18世纪末大数学家欧拉发明的游戏。于1970 年代首先由美国的一家数学逻辑游戏杂志发表,当时名为 Number Place 。现今流行的数独于1984年由日本游戏杂志《パズル通信ニコリ》发表并得了现时的名称。数独本是“独立的数字”的省略,因为每一个方格都填上一个个位数。 后来在日本流行起来。直至 2004 年,曾任香港高等法院法官的高乐德( Wayne Gould )在日本旅行的时候,发现杂志的这款游戏,便带回伦敦向《泰晤士报》推介并获得接纳。英国《每日邮报》也于三日后开始连载,使“数独”在英国正式掀起热潮,成为英国当下的流行游戏。其他国家和地区受其影响也开始连载“数独”。现在在几个国家的任何一个书店都可以看到“数独&游戏小册子,还有“ 数独”年历、“数独”游戏机等。[解法举例]先注意其中一个方格,限定该方格内可以填写的数字。 注意其中一列(或者其中一个小九宫格),寻找填写某数字的方格。 学过“资料结构”的人,可以尝试用Backtrack试试。 数独的通解方法及步骤: 根据以下方法可以确保最终得到数独的解,而且通过手工运算的时间基本可以控制在1.5个小时,不论难易程度,所以此方法可以作为取得数独答案的一般解法。 1、根据横列、竖列和方格的限制条件排除各个点不可能的数字,并从1-9将各个可能的数字用小字体逐个写进每个空白的格子。(该步骤大约需要15-20分钟,这是求解的初始,务必确保没有遗漏)。2、审视第一步骤的结果,如果发现某个空格只有一个数字,即确定该空格为这个数字。并根据该数字审视其相关的横列、竖列和方格,并划除相同的数字。(该情况出现的可能往往不多,除了较简单的数独题,但这是一个必要的过程,而且在随后的过程中要反复使用此方法。)3、审视各个横列、竖列和方格中罗列出的可能的数字结果,若发现某一个数字在各个横列、竖列或方格中出现的次数仅一次,则可以确定该空格的解为此数字。并根据第二条的方法排除与此空格相关列或方格中相同的数字。4、审视各个横列、竖列和方格中罗列的各个可能的结果,找出相对称的两个数组合的空格(或3个、4个组合),并确定这两个空格(或3个、4个)的数字只可能为这两个数字,即两个数字在这两个空格的位置可以交换,但不可能到该行、该列或该方格的其他位置。根据此结果可以排除相关列或方格罗列出相关数字的可能,并缩小范围。(该步骤处理的难度相对复杂,需要在积累一定经验的基础上进行,也是最终求解的关键)5、反复使用2、3、4提到的步骤,逐步得到一个一个空格的解,并将先前罗列的各种可能的结果一个一个排除,使可能的范围越来越小,直至得到最后结果。
参考资料:
数独的相关知识
等待您来回答
您可能关注的推广回答者:回答者:
下载知道APP
随时随地咨询
出门在外也不愁1664人阅读
数独游戏(2)之单点触摸事件,碰撞检测,计算出不可用数据
1)单点触摸事件
就是手触摸屏幕时,根据操作的行为来激发某事件
需要重写view父类的 public boolean onTouchEvent(MotionEvent event) 方法
package com.
import com.soduku.R;
import android.content.C
import android.graphics.C
import android.graphics.C
import android.graphics.P
import android.graphics.Paint.FontM
import android.view.MotionE
import android.view.V
public class ShuduView extends View {
//单元格的宽度和高度
private Game game = new Game();
public ShuduView(Context context)
super(context);
//w:整个 veiw 的宽度;
h:整个 veiw 的高度
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// TODO Auto-generated method stub
//把整个屏幕分成 九宫格 的每个格子的宽度和高度
this.width = w/9
this.height = h/9
super.onSizeChanged(w, h, oldw, oldh);
public void onDraw(Canvas canvas) {
Paint backgroundPaint = new Paint();
//从配置文件中 获取颜色值
backgroundPaint.setColor(this.getResources().getColor(R.color.shudu_background));
//画出整个手机屏幕的 的背景色
canvas.drawRect(0, 0, this.getWidth(), this.getHeight(), backgroundPaint);
//----------------------------------------
Paint darkPaint = new Paint();
darkPaint.setColor(this.getResources().getColor(R.color.shudu_dark));
Paint hilitePaint = new Paint();
hilitePaint.setColor(this.getResources().getColor(R.color.shudu_hilite));
Paint lightPaint = new Paint();
lightPaint.setColor(this.getResources().getColor(R.color.shudu_light));
//画九宫格里面的 横线,纵线,每次画出的线要想达到某种效果,需画两条 之间格1像素的位置,且颜色也要搭配好
for(int i = 0 ; i & 9 ; i++ )
canvas.drawLine(0, i*height, this.getWidth(), i*height, lightPaint);
canvas.drawLine(0, i*height+1, this.getWidth(), i*height+1, hilitePaint);
canvas.drawLine(i*width,0, i*width, this.getHeight(), lightPaint);
canvas.drawLine(i*width+1,0, i*width+1, this.getHeight(), hilitePaint);
//把整个 屏幕的格子 分成9个大的 9 宫格,每个大的9宫格 里面又有9个小格,
实际上就是 用颜色比较深的线隔开
for(int i = 0 ; i & 9 ; i ++)
if(i%3 != 0)
canvas.drawLine(0, i*height, this.getWidth(), i*height, darkPaint);
canvas.drawLine(0, i*height+1, this.getWidth(), i*height+1, hilitePaint);
canvas.drawLine(i*width,0, i*width, this.getHeight(), darkPaint);
canvas.drawLine(i*width+1,0, i*width+1, this.getHeight(), hilitePaint);
//设置在表格上显示的数字
Paint numberPaint = new Paint();
numberPaint.setColor(Color.BLACK);
numberPaint.setStyle(Paint.Style.STROKE); //让其画出来的东西是 空的
numberPaint.setTextSize(height*0.75f); //设置字体大小
numberPaint.setTextAlign(Paint.Align.CENTER); //让字体居中
float x = width/2
//调整字体的位置 ( 度量)
比如居中,调整垂直方向上的居中
FontMetrics fm = numberPaint.getFontMetrics();
fm.ascent 都是基于 基准线 而言
float y = height/2f - (fm.ascent+fm.descent)/2 ;
//System.out.println(&y:&+y+&fm.ascent:&+fm.ascent+&fm.descent:&+fm.descent);
//初始化数据
for(int i = 0 ; i & 9 ; i ++)
for(int j = 0 ; j & 9 ; j ++)
canvas.drawText(game.getTileString(i, j), i*width+x,j*height+y , numberPaint);
super.onDraw(canvas);
//鼠标(手) 触动 手机屏幕 事件,当 手 触动 该 view 时 该函数会被调用
public boolean onTouchEvent(MotionEvent event) {
//判断 手 触摸屏幕的 动作(点击,滑动等等),来进行流程控制,作出相应的操作
if( event.getAction() != event.ACTION_DOWN )
return super.onTouchEvent(event);
//获取 点击 哪个单元格的坐标
int selectedX = (int)(event.getX()/width) ;
int selectedY = (int)(event.getY()/height) ;
int used[] = game.getUsedTilesByCoor(selectedX, selectedY);
//把获取某单元格 不可用的数据 打印出来
for(int i = 0 ; i & used. i ++)
System.out.println(used[i]);
2)碰撞检测
获取单元格的坐标
3)计算出不可用数据
这里定义了一个三维数组,来存放已经不可用的数据
具体计算某个单元格中,不可用的数据(包括整行,整列,一个九宫格中,都不可出现重复的数字),如下
1)计算 该单元格中& 《列》上不可用的数据
2)计算 该单元格中& 《行》上不可用的数据
3)用于计算一个《九宫格 里面》不可用的数据
4)对于一些没有赋上值数组元素进行压缩删除
具体代码:
package com.
public class Game {
//初始化 九宫格的数据
private final String initStr =
//定义一个 数组 存放 初始化数据,首先 要将 initStr里面的数据分离开,存放在数组里
private int[] shuduku = new int[9*9] ;
//用于存储 已经使用过的 数据
private int[][][] used = new int[9][9][]
public Game()
shuduku = fromPuzzleString(initStr) ;
calculateAllUsedTiles() ; //一创建对象的时候,就把每个单元格中 不可用的数据存到 三维数组里
//通过传来的坐标值,获取 该坐标 的 具体值(整数)
private int getTile(int x , int y)
return shuduku[y*9+x] ;
public String getTileString(int x , int y)
int v = getTile(x , y);
if(0 == v)
return && ;
return String.valueOf(v); //把获取的 整数 转成 字符串
//把字符串 一个个分离出来,存放至 shudu数组中,通过返回值,赋值给 shuduku数组中
public int[] fromPuzzleString(String str)
int[] shudu = new int[str.length()] ;
for(int i = 0 ; i & str.length() ; i++)
shudu[i] = str.charAt(i) - '0' ; //把获取的单个字符减去 '0' 转成整数,赋给 整形 shudu数组中
//用于计算 所有单元格中 不可用的 数据,返回一个 一维数组赋值给 三维数组
public void calculateAllUsedTiles()
for(int i = 0 ; i & 9 ; i++)
for(int j = 0 ; j & 9 ; j ++)
// 这里的 数组 赋值,只要 它们 加起来 是 三维 即可,假如是 四维 也一样
used[i][j] = calculateUsedTiles(i , j) ;
// 取出某个单元格中 不可用的 数
public int[] getUsedTilesByCoor(int x , int y )
return used[x][y] ;
//《用于计算
某一单元格 已经不可用的 数据》
public int[] calculateUsedTiles(int x , int y)
int[] c = new int[9] ;
//计算 该单元格中
《列》上不可用的数据
for(int i =0 ; i & 9 ; i++ )
// 在 该选中的单元格 中 不需计算
if(i == y)
int t = getTile(x, i) ;
if(t != 0)
//计算 该单元格中 《行》上不可用的数据
for(int i =0 ; i & 9 ; i++ )
// 在 该选中的单元格 中 不需计算
if(i == x)
int t = getTile(i, y) ;
if(t != 0)
//用于计算一个《九宫格 里面》不可用的数据
int startX = (x/3)*3 ;
int startY = (y/3)*3 ;
for(int i = startX ; i & startX + 3 ; i ++)
for(int j = startY ; j & startY + 3 ; j ++)
if(i == x && j == y)
int t = getTile(i, j) ;
if(t != 0)
// 经过 上面的程序 检测出不可用的数据,存在c数组中,由于还有一些没有 赋值,默认为 0,需要进行压缩,把默认设置为0的数组值,进行删除
// 把数组里面为0 的数 过滤 掉,用 nused 来标识有几个不为0的数
int nused = 0 ;
for(int t : c)
if(t != 0)
nused ++ ;
int[] c1 = new int[nused] ;
nused = 0 ;
for(int t : c)
if(t != 0)
c1[nused++] =
return c1;
MainActivity类
package com.
import android.app.A
import android.os.B
public class MainActivity extends Activity {
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new ShuduView(this));
其他的,比如colors.xml这些可参考&
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:242367次
积分:2676
积分:2676
排名:第4731名
原创:79篇
评论:121条
(1)(1)(2)(1)(6)(9)(21)(24)(4)(10)(2)(4)这个是不是有问题,填不出来。。。_数独吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:25,546贴子:
这个是不是有问题,填不出来。。。收藏
<div class="clearfix BAIDU_CLB_AD BAIDU_CLB_AD_pb" id="BAIDU_CLB_AD_">
题没问题,且难度不大,排除法就能全部填完了
登录百度帐号我的游戏推荐游戏
后查看最近玩过的游戏
使用签名档&&
为兴趣而生,贴吧更懂你。或}

我要回帖

更多关于 数独怎么做 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信