数独生成算法?这个还真不好搞,不过我当初写数独游戏的时候随便捣鼓出来过一个,你自己去改改吧,至于这个算法能不能生成所有的数独,我还真没论证过。
原理:对一个给出的数独棋盘的所有行或列携正交换给出的两个数X、衫隐物Y,数组或液仍满足数独规则。如给出1、2,则对所有列交换1、2的位置,数组仍满足数独规则。
由于对棋盘的演进是随机的,所以相当于随机生成数独棋盘啦。每次演进的次数最好大一点,10次以上吧,以保证每个数都被换过位置。
具体代码就不用我写了吧,嘎嘎……
当年我们做大程的时候本来也想做数独来着,后来时间不够没做成.不知道专业人士怎么编的,只能提供一点当时的思路给你,1.9*9个格子对应一个数组A,数组的第一个值从0到9表示其中填的数字,0就是不填,另一个值表示它在桌面上的位置就是坐标
2.需要10张图片,空白和9个数字
3.通过对鼠标点击的反应改变格子数组A的值,且将相应图片覆盖在相应坐标上
4.事先输入若干组数组A的值(每组81个数),作为题库
5.进行游戏时随空慧春机抽取题库中的一组,再随机抽取若碧伏干格子显示出来,其他留白.
6.填完后用三个循环判断下每行每列每块是否有相同的数字,没有则通过斗耐.
具体编按钮、放图、鼠标点击响应等各种问题查一下书,有很多书上有很多教的这种一小段一小段的程序源代码,直接抄下就行了。
加油^^
写了个C语言的,供楼主参考:难度可以通过int leave[3]={45,54,63}调整/*******************************************************************************
suudookuu.c
*******************************************************************************/
#include <stdio.h>
#include <time.h>
int Sudoku[9][9]={1,2,3,4,5,6,7,8,9,
4,5,6,7,8,9,1,2,3,
7,8,9,1,2,3,4,5,6,
2,3,1,5,6,7,8,9,4,
5,6,4,8,9,1,2,3,7,
8,9,7,2,3,4,5,6,1,
3,1,2,6,4,8,9,7,5,
6,4,5,9,7,2,3,1,8,
9,7,8,3,1,5,6,4,2}
char level[][8]={"EASY","NORMAL","HARD"}
int nlevel
void display()
void make_sudoku()
int verify(int,int,int)
void main()
{
int i,j
int nLeft=81
int xPos,yPos,num
char msg[128]
char ch
do
{
system("cls")
printf("Game Level :\运改n")
printf(" [0] Easy\n")
printf(" [1] Normal\n")
printf(" [2] Hard\n")
printf("\握行nYour choice:")
scanf("%d",&nlevel)
} while(nlevel<0||nlevel>2)
make_sudoku(nlevel)
for(i=0i<9i++)
for(j=0j<9j++)
if(Sudoku[i][j]) nLeft--
strcpy(msg,"Good luch for you!")
while(nLeft)
{
system("cls")
printf("\旁皮判nLevel: %s\n",level[nlevel])
printf("\n%s\n\n",msg)
display()
printf("Input <x,y,num>:")
scanf("%d,%d,%d",&xPos,&yPos,&num)
if(xPos==0 &&yPos==0) break
if(verify(xPos, yPos, num))
{
strcpy(msg,"Come on,BABY!")
nLeft--
}
else
{
strcpy(msg,"input error:please try again!")
}
}
if(nLeft==0) printf("\n\nCongratulation!You are the No.1!\n")
else printf("\n\nSee you next time!\n")
getch()
}
void display()
{
int i,j
printf("\n y 1 2 3.4 5 6.7 8 9.\n")
printf("x ...................\n")
for(i=0i<9i++)
{
printf("%d .", i+1)
for(j=0j<9j++)
{
if(Sudoku[i][j]>0 &&Sudoku[i][j]<10)
printf("%d", Sudoku[i][j])
else
printf(" ")
if(j%3==2) printf(".")
else printf(" ")
}
printf("\n")
if(i%3==2) printf(". ...................\n")
}
}
void make_sudoku(int nLevel)
{
int i,j,n
int t
int leave[3]={45,54,63}
srand(time(NULL))
for(n=0n<10n++)
{
i = rand()%3 * 3 + rand()%3
for(j=0j<9j++)
{
t = Sudoku[i][j]
Sudoku[i][j] = Sudoku[i/3*3][j]
Sudoku[i/3*3][j] = t
}
i = rand()%3 * 3 + rand()%3
for(j=0j<9j++)
{
t = Sudoku[j][i]
Sudoku[j][i] = Sudoku[j][i/3*3]
Sudoku[j][i/3*3] = t
}
}
n=0
while(n<leave[nLevel])
{
t = rand()%81
i=t/9
j=t%9
if(Sudoku[i][j])
{
Sudoku[i][j]=0
n++
}
}
}
int verify(int x,int y,int n)
{
int i,j,p,q
if(x<0||x>8||y<0||y>8||n<1||n>9||Sudoku[x][y]) return 0
for(i=0i<9i++) if(i!=x &&Sudoku[i][y] == n) return 0
for(j=0j<9j++) if(j!=y &&Sudoku[x][j] == n) return 0
p=x/3*3
q=y/3*3
for(i=pi<p+3i++)
for(j=qj<q+3j++)
if((i!=x||j!=y) &&Sudoku[i][j]==n) return 0
Sudoku[x][y]=n
return 1
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)