以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  怎样在数独中随机的位置产生随机数??  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=76055)


--  作者:kivin
--  发布时间:7/17/2009 10:13:00 AM

--  怎样在数独中随机的位置产生随机数??

玩法:在9格宽×9格高的大九宫格中有9个3格宽×3格高的小九宫格,并提供一定数量的数字。根据这些数字,
利用逻辑和推理,在其他的空格上填入1到9的数字。每个数字在每个小九宫格内不能出现一样的数字,
每个数字在每行、每列也不能出现一样的数字。

在9*9的格子里面产生27个数,现在我程序可以暂时确定随机数的位置,但是要产生1-9的随机数而且每行每列每个宫格中数字都不重复,应该怎么办呀???
求各位高手指点一下,不甚感激!!!


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SMAX 1024
main()
{
int i,j;
int m,n,p,Loc,a[27];
srand(time(0));
for(m=0;m <27;m++)
{
a[m]=rand()%81;
for(n=0;n <m;n++)/*判断是否和前面产生的数相同*/
if(a[m]==a[n]) {m--;break;}
}
for(m=0;m <27;m++)
{
j=a[m]%9;
i=(a[m]-j)/9;
p=(i/3)*3+j/3;//判断m处在第几块(宫)
Loc=a[m]+1;

printf("Loc:%2d i:%dj:%d m:%d\n",Loc,i,j,p);
}
// printf("%d ",a[m]+1);
printf("\n");
return 0;
}


/*a[9][9]中编号各宫i:0-8;且每宫内数组由a[(i/3)*3][(i%3)*3]->a[(i/3)*3+2][(i%3)*3+2]构成
其中i又可由i=m%3*3+n%3得到*/

/


--  作者:一分之千
--  发布时间:7/21/2009 10:56:00 AM

--  
大体想了下, 就是重复生成随机数直到整行整列 以及小九宫格数字都不重复为正确, 可以考虑下递归函数


for( i = 0 to 8)
{
for( j = 0 to 8)
{
a[ij]= randomNum();
}

int randomNum()
{
rand(a[ij])
if( a[ij]==a[*j] || a[ij] == a[i*])
{ randomNum();
}
//判断所在小的九宫格
if( repeat)
{
randomNum();
}
}


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
9,013.916ms