1、首先,我们打开我们电仔正脑上面的excel;
2、然后我们在单机点击文件;
3、之后我们在单机点击新建;
4、然后我们在单机点击教育;
5、之后我们点击数独求解;
6、然后我们点击下载歼闹;
7、结果如图所示念改悔,这样我们就制作好数独求解了。
实在对不起,你的程序我没有看明白。说一下思路:
用递乎岁归的方法把数独填好。然后再递归枣顷袭的循环改成从随机值开始转一圈即可。
http://zhidao.baidu.com/question/33417315.html
为你的需要简化后的样子:
program sdjsq{数独解算器}
{-------------调用库------------------------------------------------USES}
uses CRT,Dos{使用CRT Dos库}
{-------------数据类型定义------------------------------------------TYPE}
type
sz=0..9{数字,byte类型的子界占一byte}
sy=1..9{same as sz}
sd=array [sy,sy] of sz{数独,占8×8×1byte=81byte}
ss=set of sy{数字凳兄的集合}
dot=
record
s:ss
n,x,y:byte
end
{-------------变量定义-----------------------------------------------VAR}
var
a:array [0..81] of sdsn:byte
x,y:byte
list:record
num:byte
dat:array [1..81] of dot
end
tryfail:boolean
{=============打印边框============================================PRINTK}
procedure printk
var
i, k : byte
flag : boolean
begin
gotoxy(1,1)textcolor(15)textbackground(0)
write(#218)for k:=1 to 8 do write(#196#194)writeln(#196#191)
for i := 1 to 9 do begin
write(#179)for k:=1 to 9 do begin
textbackground(1-ord(((i-1) div 3+(k-1) div 3) mod 2=0))
write(#32)textbackground(0)write(#179)
end
writeln
if i<>9 then begin
write(#195)for k:=1 to 8 do write(#196#197)writeln(#196#180)
end
end
write(#192)for k:=1 to 8 do write(#196#193)writeln(#196#217)
gotoxy(1,1)
end
{=============可以填的数==============================================KY}
procedure ky(a:sdx,y:bytevar s:ss)
var
i,j:byte
begin
s:=[1,2,3,4,5,6,7,8,9]
for i:=1 to 9 do if i<>x then s:=s-[a[i,y]]
for i:=1 to 9 do if i<>y then s:=s-[a[x,i]]
for i:=1 to 3 do for j:=1 to 3 do
if ((x-1)div 3*3+i<>x) and ((y-1)div 3*3+j<>y)
then s:=s-[a[(x-1)div 3*3+i,(y-1)div 3*3+j]]
s:=s-[0]
end
{=============打印数据=============================================PRINT}
procedure print(xn,yn,color:byte)
begin
gotoxy(2*xn,2*yn)
textbackground(5+ord(not ((x=xn)and(y=yn)))*(-4-ord(((xn-1) div 3+(yn-1) div 3) mod 2=0)))
if (sn=0) or (color=10) then textcolor(color) else textcolor(7)
if (a[sn,xn,yn]<>0) and (color<>0) then write(a[sn,xn,yn]) else write(#32)
gotoxy(1,1)
end
{=============递归求解===============================================TRY}
function answer:boolean
var
ans:boolean
procedure try(num:bytenumar:byte)
label 1
var
i,j,n,x,y:byte
s:ss
begin
sn:=numara[sn]:=a[sn-1]tryfail:=falseif tryfail then goto 1{per-think}
if keypressed then case readkey of #27:halt#0:if readkey=#107 then haltend
if num<=list.num then begin
x:=list.dat[num].xy:=list.dat[num].y
ky(a[sn],x,y,s)if s=[] then exit
n:=random(8)+1
for j:=n to n+8 do begin
i:=j mod 9+1
if i in s then begin
a[sn,x,y]:=iprint(x,y,10)
try(num+1,numar+1)
a[sn,x,y]:=0print(x,y,0)
end
end
end else begin
gotoxy(1,20)textcolor(15)textbackground(0)dellinewrite('Complete!')
readkey
halt
end
1:for i:=1 to 9 do for j:=1 to 9 do if a[sn,i,j]<>a[sn-1,i,j] then print(i,j,0)
sn:=numar-1
end
begin
answer:=falseans:=false
try(1,1)
end
procedure crtinit
var
OrigMode: Word
begin
OrigMode:=LastMode { Remember original video mode }
TextMode(Lo(LastMode)+Font8x8) { use 43 or 50 lines on EGA/VGA }
end
var i:byte
begin
randomizecrtinittextbackground(0)clrscrsn:=0printk
fillchar(a[0],sizeof(a[0]),0)
list.num:=81for i:=1 to 81 do with list.dat[i] do begin
s:=[1..9]x:=(i+8) div 9y:=i mod 9+1
end
answer
end.
当年我们做大程的时候本来也想做数独来着,后来时间不够没做成.不知道专业人士怎么编的,只能提供一点当时的思路给你,1.9*9个格子对应一个数组A,数组的第一个值从0到9表示其中填的数字,0就是不填,另一个值表示它在桌面上的位置就是坐标
2.需要10张图片,空白和9个数字
3.通过对鼠标点击的反应改变格子数组A的值,且将相应图片覆盖在相应坐标上
4.事先输入若干组数组A的值(每组81个数),作为题库
5.进行游戏时随机抽取题库中的一组,再随机抽取若干格子显示出来,其他留白.
6.填完后用三个循环判断下每行每列每块是否有相同的数字,没有则通过.
具体编按钮、放图、鼠标点击响应等各种问题查一下书,有很多书上有很多教的这种一小段一小段的程序源代码,直接抄下就行了。
加油^^
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)