本文主要是介绍一个python数独暴力解法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
暴力解决,需要进行的尝试比较多,对尝试次数进行了统计
不废话,上代码,各代码的功能参见注释:
解释器python3.1,开发环境Eclipse pydev1.4
源码如下
******************************************************
#coding=gbk
from sys import exit
from sys import stdout
#last数组记录赋值的顺序
last=[]
#i行号、j列号
i=0
j=0
#该函数比较是否满足数独规律
def issame(a):
global i
global j
#比较i行是否重复
for n in range(9):
if n!=j:
if a[i][j]==a[i][n]:
return True
#比较j列是否重复
for m in range(9):
if m!=i:
if a[m][j]==a[i][j]:
return True
#比较9宫格内是否重复
if(i<=2):
loop_x=0
elif(i<=5):
loop_x=3
else:
loop_x=6
if(j<=2):
loop_y=0
elif(j<=5):
loop_y=3
else:
loop_y=6
for m in range(loop_x,loop_x+3):
for n in range(loop_y,loop_y+3):
if m!=i or n!=j:
if a[i][j]==a[m][n]:
return True
return False
#对a[i][j]进行赋值
#该函数为a[i][j]赋值,并保证满足数独规律,当a[i][j]无解时回退
def loop_start(a,x):
global last
global i
global j
a[i][j]=x+1
if issame(a):
loop_start(a,a[i][j])
else:
#1-9所有数都不满足条件,回退
if a[i][j]>9:
a[i][j]=0
last=last[:-2]
i=last[-2]
j=last[-1]
loop_start(a,a[i][j])
return
主函数,遍历数组a,为每个元素赋值
def main(a):
global last
global i
global j
times=0
while i<9:
j=0
while j<9:
if a[i][j]==0:
times+=1
if times>1000000:
print("Try more than 1000000 times,Please check your input")
exit(1)
last.append(i)
last.append(j)
loop_start(a,0)s
j+=1
i+=1
print('/nTry',times ,'times')
print('Done/n')
for m in range(9):
for n in range(9):
stdout.write(str(a[m][n]))
print()
'''
if n==2 or n==5:
print('|')
print()
if m==2 or m==5:
print('-'*21)
'''
if __name__=='__main__':
b=[]
a=[]
#从文件读取二维数组a并检验其合法性,值为0的元素表示需要填入的值
file=open('c://number.txt')
for m in range(9):
numbers=file.readline().strip()
#numbers=input('Input Line %d >'%(m+1)).strip()
if len(numbers)!=9:
print('Wrong input!')
exit(1)
else:
for n in range(9):
b.append(int(numbers[n]))
a.append(b)
b=b[0:0]
for m in range(9):
for n in range(9):
if a[m][n]>9 or a[m][n]<0:
print('Wrong input!')
exit(1)
main(a)
******************************************************
******************************************************
输入文件number.txt
400005000
005030010
007000002
600050300
004008900
003000007
900000500
010060700
000400008
******************************************************
******************************************************
输出结果:
Try 44006 times
Done
491625873
265837419
837149652
679254381
124378965
583916247
942781536
318562794
756493128
******************************************************
(The End)
这篇关于一个python数独暴力解法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!