如何用excel做数独???

如何用excel做数独???,第1张

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.填完后用三个循环判断下每行每列每块是否有相同的数字,没有则通过.

具体编按钮、放图、鼠标点击响应等各种问题查一下书,有很多书上有很多教的这种一小段一小段的程序源代码,直接抄下就行了。

加油^^


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存