用C语言如何随机生成一个数独?

用C语言如何随机生成一个数独?,第1张

数独生成算法?这个还真不好搞,不过我当初写数独游戏的时候随便捣鼓出来过一个,你自己去改改吧,至于这个算法能不能生成所有的数独,我还真没论证过。

原理:对一个给出的数独棋盘的所有行或列携正交换给出的两个数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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12401045.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存