用VBA解数独程序

用VBA解数独程序,第1张

为方便起见,建名称“数独盘”和“可选数”,分别代表B2:J10和B12:J20两个区域。用如下VBA程序清空初盘:Sub 清空初盘()

Dim rag As Range

For Each rag In Range("数独盘")

rag.ClearContents

rag.Font.Bold = False

Next

End Sub

用如下VBA程序把初盘“粗体化”:Sub 粗体初盘()

Dim rag As Range

For Each rag In Range("数独盘")

If rag.Value = "" Then

rag.Font.Bold = False

Else

rag.Font.Bold = True

End If

Next

End Sub为建“可选数”表,先用如下程序语句清空“可选数”区域:Range("可选数").ClearContents '清空可选数

以下程序段,作为解数独的初始化工作的一部分完成如下工作:在“数独盘”区域仅保留粗体的已知数作为初盘。在“可选数”区域的与“数独盘”已知数对应的单元格,抄录已知数,其他单元格取“123456789”。程序如下:For Each rag In Range("可选数")

If rag.Offset(-10, 0).Font.Bold Then '“数独盘”中用粗体字表示已知数

rag.Value = rag.Offset(-10, 0).Value '把“数独盘”中的已知数抄录到对应的“可选数”区域中的相应位置

Else

rag.Value = "123456789" '“数独盘”中的未知数在“可选数”区域中的相应位置设置成“123456789”

rag.Offset(-10, 0).Value = "" '“数独盘”中的未知数用空格表示

End If

Next

接下来的初始化工作就是建立对应于初盘的可选数表。这部分工作和以后要讲的用“排除法”解数独题有相似之处。这些相似的工作用“处理确定数”子程序来完成。现在在“可选数”区域,寻找长度为1的数作为确定数,把该单元格置为空格,记下该单元格的行号和列号,由“处理确定数”子程序作相应处理。程序如下:For Each rag In Range("可选数")

If Len(rag.Value) = 1 Then

qds = rag.Value '已知数作为“确定数”

rag.Value = "" '对应于“确定数”在“可选数”区域设为空格,表示无别的数可选

i% = rag.Row - Range("可选数").Row + 1 '计算“确定数”在“可选数”区域的行号

j% = rag.Column - Range("可选数").Column + 1 '计算“确定数”在“可选数”区域的列号

Call 处理确定数(i%, j%, qds)

End If

Next

待续

前两天刚写完,还没优化,已运行通过了.

晕,一维的好麻烦,这个也是碰巧前两天刚写好的,你看着自己修改下

#include <stdio.h>

typedef struct

{

int line

int row

int num

}Node

int main()

{

/*

int a[9][9]={

{4,0,3,6,0,0,0,0,0},

{0,0,0,0,0,1,0,2,4},

{0,1,0,0,4,0,5,0,0},

{0,0,0,9,0,4,0,6,0},

{3,0,2,0,0,0,4,0,9},

{0,7,4,1,0,3,0,0,0},

{0,0,1,0,9,0,0,4,0},

{2,4,0,3,0,0,0,0,0},

{0,0,0,4,0,8,2,0,7}}

*/

int a[9][9]={

{0,0,0,8,0,0,0,6,0},

{8,7,0,0,0,0,0,0,0},

{2,9,0,0,4,1,0,0,5},

{0,0,5,7,0,0,0,0,9},

{0,2,0,0,0,0,0,1,0},

{9,0,0,0,0,4,3,0,0},

{7,0,0,6,1,0,0,9,8},

{0,0,0,0,0,0,0,5,2},

{0,6,0,0,0,9,0,0,0}}

/*

int a[9][9]={

{0,2,0,0,6,0,0,0,0},

{0,9,0,4,0,5,1,3,0},

{0,0,8,7,0,0,0,0,5},

{6,0,0,3,0,0,4,0,0},

{0,0,0,9,0,6,0,0,0},

{0,0,7,0,0,1,0,0,3},

{4,0,0,0,0,7,3,0,0},

{0,8,5,2,0,4,0,7,0},

{0,0,0,0,9,0,0,1,0}}

*/

/*

int a[9][9]={

{0,0,3,0,2,0,0,0,6},

{0,0,2,0,9,0,0,0,4},

{7,0,0,8,0,0,2,0,3},

{0,8,0,0,7,0,5,0,0},

{0,7,0,1,0,6,0,3,0},

{0,0,0,2,0,0,0,9,0},

{4,0,6,0,0,8,0,0,5},

{6,0,0,0,4,0,3,0,0},

{9,0,0,0,1,0,7,0,0}}

*/

int i,j,n,en,flag,y,k=0,x,qu,p,q

Node b[70]

for(i=0i<9i++)

{

for(j=0j<9j++)

{

if(!a[i][j])

{

b[k].line=i

b[k].row=j

b[k].num=0

k+=1

}

}

}

en=k

/*从b[0]开始试,若b[k].num>9,则k-1,否则k+1*/

for(k=0k<en)

{

++b[k].num

i=b[k].line

j=b[k].row

a[i][j]=b[k].num

n=0

while(n<9&&b[k].num<=9)

{

if(n==i)

{

for(y=0y<9y++)

{

if(y==j)

continue

if(a[n][y]==a[i][j])

flag=1

}

}

else if(n==j)

{

for(y=0y<9y++)

{

if(y==i)

continue

if(a[y][n]==a[i][j])

flag=1

}

}

/*判断同一块中有没有相同值*/

qu=3*(i/3)+j/3

switch(qu)

{

case 0:x=0

y=0

break

case 1:x=0

y=3

break

case 2:x=0

y=6

break

case 3:x=3

y=0

break

case 4:x=3

y=3

break

case 5:x=3

y=6

break

case 6:x=6

y=0

break

case 7:x=6

y=3

break

default :x=6

y=6

break

}

p=x

q=y

for(x<p+3x++)

{

for(y<q+3y++)

{

if(x==i&&y==j)

continue

if(a[x][y]==a[i][j])

{

flag=1

break

}

}

if(flag==1)

break

}

if(flag==1)

{

a[i][j]=++b[k].num

flag=0

n=0

continue

}

n++

}

if(b[k].num>9)

{

a[i][j]=b[k].num=0

k--

if(k<0)

{

printf("error!\r\n")

return -1

}

}

else

k++

}

for(i=0i<9i++)

{

for(j=0j<9j++)

{

printf("%d",a[i][j])

}

printf("\r\n")

}

return 1

}


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

原文地址: https://outofmemory.cn/yw/10991013.html

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

发表评论

登录后才能评论

评论列表(0条)

保存