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++写。

那位有更好的方法,或想助我一臂之力,请回复。

没有评论: