终于搞出来一个了,不容易。
源代码及下载:http://sites.google.com/site/xhackerbase/Home/suduku
此版本可以生成数独,命令行界面,无其他功能。如果要加上做数独的功能,有两大难点:
1.挖洞:如何挖出难度很大的数独题,又有唯一解?只有再写一个求解的函数;
2.控制:命令行的程序无法控制,一种方法是用GUI(GTKmm),其二是使用curses(这个能跨平台吗?Linux和Mac倒是都没问题),都有一定难度。
还请大家多多指教,发表意见,期待下一版本。
2008年8月10日星期日
数独 Sudoku
最近突然对数独了感兴趣了。经过一番研究,现在,我基本上已经不怕任何难度的数独了。怎么办呢?我决定编一个生成数独的程序,经过一番思考,有以下两个想法:
1) 先随即生成一个3*3,然后再把其中的1*3向右下平移,3*1向下右平移。总之说白一点就是把3*3变换到9*9。这个非常简单,就是做出的数独太有规律了;
2) 按照[1][1], [1][2], ..., [1][9], [2][1], ..., [9][9]的顺序慢慢生成。(俺家CPU还行,呵呵)。
建立几个函数:
bool isUni_Row (int row);
bool isUni_Col (int col);
bool isUni_Nine (int row, int col);
bool isUni (int row, int col)
//用来检查生成数字在行、列、3*3中的唯一性
int randNum (int time); /*用来生成随机数,time是生成的次数,生成9次随机数不能重复(可以用time控制)*/
从第1个格一直到第99个格,每个格都
sudoku[row][col] = randNum (time);
time++;
if (!(isUni (row, col))) {/*重新算这个格,如果time==9,回到上一个格*/}
以上是大致的方法,当然估计计算量会惊人。
过几天写完以后,我会放出代码。因为最近在学C++,所以用C++写。
那位有更好的方法,或想助我一臂之力,请回复。
1) 先随即生成一个3*3,然后再把其中的1*3向右下平移,3*1向下右平移。总之说白一点就是把3*3变换到9*9。这个非常简单,就是做出的数独太有规律了;
2) 按照[1][1], [1][2], ..., [1][9], [2][1], ..., [9][9]的顺序慢慢生成。(俺家CPU还行,呵呵)。
建立几个函数:
bool isUni_Row (int row);
bool isUni_Col (int col);
bool isUni_Nine (int row, int col);
bool isUni (int row, int col)
//用来检查生成数字在行、列、3*3中的唯一性
int randNum (int time); /*用来生成随机数,time是生成的次数,生成9次随机数不能重复(可以用time控制)*/
从第1个格一直到第99个格,每个格都
sudoku[row][col] = randNum (time);
time++;
if (!(isUni (row, col))) {/*重新算这个格,如果time==9,回到上一个格*/}
以上是大致的方法,当然估计计算量会惊人。
过几天写完以后,我会放出代码。因为最近在学C++,所以用C++写。
那位有更好的方法,或想助我一臂之力,请回复。
订阅:
博文 (Atom)