- 浏览: 1153830 次
- 性别:
- 来自: 上海
最新评论
-
LD_21:
...
无锡旅游归来 -
cat:
赞,这招有点创意。一般他们提交的demo都是些什么样的?
招人不难 -
daly1987:
不错啊,找到这个帖子学习。
ANTLR学习心得——表达式(1) -
hbsycw:
文笔不错,平铺直叙,坦诚~
我的野蛮成长 -
RonQi:
potian后来没有回复吗
与potian兄闲聊
以前没有学过ruby,这回练练手,用ruby写了一个“出数独题”的小程序。抛砖引玉,看看有没有解数独题的算法被引出来
Table=Array.new(9) def getNumber(a) return nil if a.length==0 sum=a.length*10 l=rand(sum)/10 return a[l] end def setTable(i,j) if Table[i][j].class==Fixnum 0.upto(8) {|pos| Table[i][pos].delete(Table[i][j]) if Table[i][pos].class==Array} 0.upto(8) {|pos| Table[pos][j].delete(Table[i][j]) if Table[pos][j].class==Array} i1=6 if i<9 i1=3 if i<6 i1=0 if i<3 j1=6 if j<9 j1=3 if j<6 j1=0 if j<3 i1.upto(i1+2) do |i2| j1.upto(j1+2) do |j2| Table[i2][j2].delete(Table[i][j]) if Table[i2][j2].class==Array end end end end def resetTable 0.upto(80) do |x| i=x/9 j=x-i*9 if Table[i][j].class==Array Table[i][j]=[1,2,3,4,5,6,7,8,9] end end 0.upto(80) do |x| i=x/9 j=x-i*9 setTable(i,j) end end def setTableValue(x) return true if x>80 i=x/9 j=x-i*9 num=getNumber(Table[i][j]) tempa=Table[i][j] if num==nil return false else Table[i][j]=num setTable(i,j) if not setTableValue(x+1) Table[i][j]=tempa resetTable tempa.delete(num) Table[i][j]=tempa return setTableValue(x) else return true end end end def initTable 0.upto(8) do |i| Table[i]=Array.new(9) end 0.upto(8) do |i| 0.upto(8) do |j| Table[i][j]=[1,2,3,4,5,6,7,8,9] end end setTableValue(0) end def getStr(num) if num.class==Array return '-' end return num.to_s end def showTable 0.upto(8) do |i| 0.upto(7) do |j| print getStr(Table[i][j])+' ' end print getStr(Table[i][8])+"\n" end end def cutTable (x) 0.upto(80) do |num| i=num/9 j=num-i*9 Table[i][j]=Array.new if rand < x end end initTable cutTable(0.8) showTable
评论
5 楼
庄表伟
2007-06-24
头撞墙,头自己去撞墙,
头自己头也不回的撞墙去了。。。
经Readonly指点,搜到一个地址:
http://markbyers.com/moinmoin/moin.cgi/ShortestSudokuSolver
楼上的几位,一同去撞墙吧。
头自己头也不回的撞墙去了。。。
经Readonly指点,搜到一个地址:
http://markbyers.com/moinmoin/moin.cgi/ShortestSudokuSolver
楼上的几位,一同去撞墙吧。
4 楼
Readonly
2007-06-24
老庄,动态语言不是这样写的,你这完全就是披着ruby外衣的java...
其他偶也不多说了,转一行ruby的数独解法代码:
将这行代码保存为sudoku.rb,接受的数独题目为从左到右,从上到下的一行字符串(0代表空位),运行:
ruby sudoku.rb 200370009009200007001004002050000800008000900006000040900100500800007600400089001
得出答案:
"284375169639218457571964382152496873348752916796831245967143528813527694425689731"
其他偶也不多说了,转一行ruby的数独解法代码:
$*.map{|a|(i=a=~/0/)?(v=*?1..?9).fill{|j|v-=[a[j+i-k=i%9],a[k+j*=9],a[j%26+i-i%3-i%27+k]]}+v.map{|k|$*.<<$`<<k<<$'}:p(a)}
将这行代码保存为sudoku.rb,接受的数独题目为从左到右,从上到下的一行字符串(0代表空位),运行:
ruby sudoku.rb 200370009009200007001004002050000800008000900006000040900100500800007600400089001
得出答案:
"284375169639218457571964382152496873348752916796831245967143528813527694425689731"
3 楼
raimundox
2007-06-24
这个东西用amb最合适了:
Amb的实现如下(zenspider的实现)
class Sudoku def initialize @square = Array.new(9) { Array.new(9) {0} } @amb = Amb.new end def find_sudoku 9.times do |row| 9.times do |col| candidate = @amb.choose(*range) @square[row][col] = 0 @amb.assert(count_in_row(row, candidate) == 0) @amb.assert(count_in_col(col, candidate) == 0) @amb.assert(count_in_sub_square(row, col, candidate) == 0) @square[row][col] = candidate end end end def range result,range = [], [1,2,3,4,5,6,7,8,9] 9.times do result << range[index = rand(range.size)] range.delete_at index end result end def count_in_row row, candidate @square[row].inject(0) {|count, num| (num == candidate) ? count + 1 : count} end def count_in_col col, candidate @square.inject(0) {|count, row| (row[col] == candidate) ? count + 1 : count} end def count_in_sub_square row, col, candidate start_row, start_col = row / 3, col / 3 count = 0 3.times {|i| 3.times {|j| count += 1 if @square[start_row * 3 + i][start_col * 3 + j] == candidate}} count end def create_sudoku number find_sudoku number.times { @square[rand(9)][rand(9)] = 0} end def next begin @amb.failure create_sudoku rescue Amb::ExhaustedError raise 'no more Sudoku' end end def inspect result = "" 9.times do |row| 9.times {|col| result << (@square[row][col] == 0 ? '?' : @square[row][col].to_s) << ' '} result << "\n" end result end end sudoku = Sudoku.new sudoku.create_sudoku 30 p sudoku
Amb的实现如下(zenspider的实现)
class Amb class ExhaustedError < RuntimeError; end def initialize @fail = proc { fail ExhaustedError, "amb tree exhausted" } end def choose(*choices) prev_fail = @fail callcc { |sk| choices.each { |choice| callcc { |fk| @fail = proc { @fail = prev_fail fk.call(:fail) } if choice.respond_to? :call sk.call(choice.call) else sk.call(choice) end } } @fail.call } end def failure choose end def assert(cond) failure unless cond end end
2 楼
Eastsun
2007-06-23
嘿嘿,偶还是新开个帖吧,赚点积分o(∩_∩)o...哈哈
http://www.iteye.com/post/318866
http://www.iteye.com/post/318866
1 楼
Eastsun
2007-06-23
嘿嘿,俺来个JAVA版的吧:
public class Solver{ private static final int SIZE = Puzzler.SIZE; private Solver(){ } /** * 数独求解 *@param p 需要求解的数独 *@return solvable 如果有解,则为true,并且将求得的一个解放置p */ public static boolean solve(Puzzler p){ int[][] num =new int[SIZE][SIZE]; boolean[][] rFlags =new boolean[SIZE][SIZE+1], cFlags =new boolean[SIZE][SIZE+1], zFlags =new boolean[SIZE][SIZE+1]; for(int r=0;r<SIZE;r++) for(int c=0;c<SIZE;c++) if(p.isFixed(r,c)){ int t =p.getNumber(r,c); num[r][c] =t; rFlags[r][t] =true; cFlags[c][t] =true; zFlags[r/3*3+c/3][t] =true; } int r =0,c =0; outLoop: for(;;){//&# if(p.isFixed(r,c)){ c ++; if(c>=SIZE){ c =0; r ++; if(r>=SIZE) break outLoop; } continue outLoop; } //&#if(p.isFixed()) int t =SIZE; for(c++;;){//&# if(t>=SIZE){ c --; if(c<0){ c =SIZE -1; r --; if(r<0) break outLoop; } if(p.isFixed(r,c)) continue; t =num[r][c]; if(t!=0){ rFlags[r][t] =false; cFlags[c][t] =false; zFlags[r/3*3+c/3][t] =false; num[r][c] =0; } } else{ t ++; if(!(rFlags[r][t]|| cFlags[c][t]|| zFlags[r/3*3+c/3][t]) ) break; } }//&#for(c++;;); num[r][c] =t; rFlags[r][t] =true; cFlags[c][t] =true; zFlags[r/3*3+c/3][t] =true; c ++; if(c>=SIZE){ c =0; r ++; if(r>=SIZE) break outLoop; } } if(r<0) return false; for(r=0;r<SIZE;r++) for(c=0;c<SIZE;c++) if(!p.isFixed(r,c)) p.setNumber(r,c,num[r][c]); return true; } public static void main(String[] args){ Puzzler p =new Puzzler(); System.out.println(solve(p)); for(int r =0;r<SIZE;r++){ for(int c=0;c<SIZE;c++) System.out.print(p.getNumber(r,c)+" "); System.out.println(); } } }
发表评论
-
作为一个JavaEye的老会员,我感到羞愧
2010-12-08 12:36 3919这次的Bambook SDK大赛,我在其中做一些社区联络与维护 ... -
开发应用程序 白拿Bambook
2010-11-11 22:29 2350本月,盛大电子书Bambook程序达人赛将正式启动。大赛奖 ... -
TCDatabase介绍(3)
2010-05-15 22:57 2746四、存储数据结构 1、TCT的存储数据结构 TC的不同 ... -
TCDatabase介绍(2)
2010-05-11 21:35 2343三、TokyoTyrant的网络协 ... -
TCDatabase介绍(1)
2010-05-08 22:54 3134TCDatabase,是我在创新院的同事,riceball的一 ... -
美国软件和菜头——《软件随想录》读后感
2010-01-16 22:44 3099一口气读完了《软件随想录》(More Joel on So ... -
与potian兄闲聊
2009-10-03 23:01 3231昨天的一篇blog,potian兄 ... -
帖子虽老,却不过时
2009-10-02 20:43 5532我昨天发的那篇《咱圈真乱 》,potian在下面留了一个言: ... -
架构师应该掌握哪些设计模式
2009-09-20 23:29 5850今天去参加了北京博文 ... -
《观止》读后感
2009-09-06 10:21 1965这篇blog,我是先在twitter上写的,然后再转帖过来,这 ... -
有关语言设计的一些联想
2009-08-01 21:51 1912引发我这些思考的,是最近一篇InfoQ的文章:《语言约束 ... -
我用Twitter的烦恼与解决方案
2009-07-20 23:12 2434挺早以前,我就注册了 ... -
我最想做的是什么?
2009-07-14 23:18 2023《费曼的彩虹》,是我最近读到的一本极好的书。最 ... -
JavaEye的历史,翻开了新的一页!
2008-11-19 22:06 6469JavaEye的Robbin昨天发了一篇blog,题目叫做《推 ... -
外国大牛也不过如此——《梦断代码》读后感
2008-09-13 20:51 8320花了一周的时间, ... -
IT开发与管理——新收获
2008-09-08 22:02 31179月4日,我略尽地主之宜,招待了大概20多位朋友。那一场研讨会 ... -
Play with Quiz — 找零钱 (3)
2008-05-06 22:50 2441要改进这两种算法,都是一个目标,就是寻找不需要列出所有解的办法 ... -
Play with Quiz — 找零钱(2)
2008-05-03 23:25 2610接着上回的讨论,我们需要写两个方法,一个找出所有的零钱组合,g ... -
Play with Quiz — 找零钱 (1)
2008-05-01 23:14 3151先把题目再抄一遍: 这周的题目是找零钱,假设我们需要找给别人3 ... -
Play with Quiz (0)
2008-04-29 22:45 2452自从Quake Wang在JavaEye贴出第一个Ruby每周 ...
相关推荐
本人使用EXCEL编制的一个简单的使用EXCEL玩数独游戏。要求不高,只要有EXCEL软件即可。
小巧的数独编辑器,现在可以编辑标准数独、宫格数独、锯齿数独、超级数独(或者叫窗口数独)、杀手数独、时钟数独等,并且数独的尺寸不限定为3x3,比如宫格数独可以编辑3x2及3x4等等的地图尺寸。压缩包中附带了若干...
数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏...
数独是一种广受欢迎的逻辑游戏,它通过填充一个9×9的网格,使得每一行、每一列以及每一个3×3的小宫格内都包含从1到9的所有数字且每个数字不重复,以此来锻炼玩家的逻辑思维和推理能力。本项目提供了一个数独验证器...
数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码...
数独是一种广受欢迎的逻辑游戏,它通过填充一个9×9的网格,使得每一行、每一列以及每一个小的3×3宫格内的数字1到9都只出现一次,来达到解谜的目的。MATLAB作为一种强大的数值计算和编程环境,可以用来编写程序解决...
本项目以Java为编程语言,实现了数独游戏的求解算法,不依赖递归,主要利用了Java的IO流来读取数独矩阵。 在Java中,我们通常使用二维数组来表示数独的矩阵。首先,我们需要一个函数来读取数独矩阵。IO流,特别是`...
每个9x9方格的数独游戏都有唯一的解,利用C++可以写出一个代码求出这一唯一解,并输出
在本文中,我们将深入探讨如何使用LabVIEW(Laboratory Virtual Instrument Engineering Workbench)这一强大的图形化编程环境来实现数独游戏。LabVIEW是由美国国家仪器公司(National Instruments)开发的一款适用...
初学者在玩数独时通常采用直观试错法,即逐个尝试数字,看是否符合数独的规则。但随着解题技巧的提升,玩家可以学习并使用更加高级的解题策略,如区域排除法、对角线观察法、唯一候选数法等。这些方法可以大大加快...
【数独】入门练习题(四宫)-200道,pdf 六宫数独300题.pdf 数独《中级》练习题(九宫)含案-100道.pdf 数独《中级》练习题(九宫)含答案-100道.pdf 数独入门-儿童数独游戏第1级-唯一法4X4.pdf 数独入门-儿童数独游戏第1级...
标题和描述虽然简洁,但足以引发我们对数独游戏的兴趣,让我们来看看其中蕴含的知识点。 首先,数独游戏的基本规则是:在一个9x9的方格中,分为9个3x3的小宫格,已有一些数字填入,玩家需要根据这些数字,用1到9的...
"Thread"可能是关于多线程处理的部分,这可能意味着游戏允许用户在同一时间进行多个数独谜题,或者使用多线程来优化算法的性能,比如通过并行计算加速解题过程。在多线程编程中,需要考虑线程安全,确保数据在并发...
杀手数独游戏可以使用软件来实现,例如:使用Python或Java等编程语言来编写杀手数独游戏的算法和界面。 8. 杀手数独的数学基础: 杀手数独游戏的数学基础是组合数学和图论,涉及到排列组合、图形理论等知识领域。 ...
在本程序中,可能使用二维数组来表示数独盘面,以便高效地进行计算。 四、编译环境 项目使用Visual Studio 2008进行编译,这是微软的经典IDE,集成了开发、调试、测试等功能,对于C++开发者来说非常友好。选择这个...
在当今计算机技术高速发展的背景下,数独解法的优化一直是程序员和算法爱好者热衷于研究的领域。数独,作为一种智力游戏,其核心在于逻辑推理和策略选择,而将这种策略与高效的编程语言C相结合,不仅能在计算速度上...
在这个上下文中,`sudo_xx.c`可能包含了实现数独求解器的函数,这些函数可能采用了回溯法、递归或其它算法来确保填入的数字符合数独规则。数独求解器可以自动填充未完成的数独盘面,帮助用户找到唯一解决方案。 总...
随着数独难度的增加,手动求解变得非常耗时,这促使研究者们开始考虑使用计算机程序来辅助求解。而随着多核处理器技术的发展,如何充分利用这些处理器核心来加速数独问题的求解成为了一个值得探索的领域。 “数独...
数独计算器 数独游戏 数独秒算 本数独游戏 采用分为闯关模式和 随机模式,随机模式中的题库更多,闯关模式会随着 关数的增加而越来越难。2个互不影响。 另外还有个数独计算器,妙算数独。 修复了上次数独计算器的2...
在Python中,这可以通过二维数组或列表来表示数独盘面,并使用递归或回溯算法来解决。 8. **用户界面**: Pygame提供了丰富的图形界面元素,可以创建按钮、文本框、提示信息等,以增强用户的游戏体验。在"main.py...