数独python_Python解决数独

#-*- coding: UTF-8 -*-

‘‘‘Created on 2017年6月9日

@author: LXu4‘‘‘

importcopyimporttimeclassSoduku(object):def __init__(self, problem):

self.problem=problemdefresolve(self):

solutionStack=[self.problem]

tmp=self.get_solution_array(self.problem)

solutionArrayStack=[tmp]

time_t=0

prev_x= -1prev_y= -1

while 1:#time_t += 1

#fetch the last solution in solution stack

next_item_cord ={}

solutionArray=[]#print ‘still ‘,len(solutionStack),‘in stack‘

solutionNow = copy.deepcopy(solutionStack[len(solutionStack) - 1])

solutionArray= solutionArrayStack[len(solutionArrayStack) - 1]

flag=self.check_if_need_to_back(solutionNow, solutionArray)if flag isTrue:#print ‘pop!‘

solutionArrayStack.pop()

solutionStack.pop()else:

time_t+= 1

#next_item_cord = self.get_first_possible_item(solutionArray,solutionNow=solutionNow)

next_item_cord = self.get_first_possible_item(solutionArray,solutionNow=solutionNow)if next_item_cord ==False:break

#print ‘next_item_cord:‘,next_item_cord

prev_x = next_item_cord[‘x‘]

prev_y= next_item_cord[‘y‘]

next_item_array=solutionArray[prev_x][prev_y]

next_item= next_item_array[len(next_item_array)-1]#randint(0,len(next_item_array)-1)

solutionNow[prev_x][prev_y] =next_item#solutionArray_tmp = get_solution_array(solutionNow)

solutionArray_tmp =copy.deepcopy(solutionArray)

solutionArray_tmp=self.get_resolution_array_new(solutionArray_tmp, prev_x, prev_y,

next_item)if next_item insolutionArray[prev_x][prev_y]:

solutionArray[prev_x][prev_y].remove(

next_item)#print ‘next point is ‘,prev_x,‘,‘,prev_y

solutionStack.append(solutionNow)

solutionArrayStack.append(solutionArray_tmp)#print solutionArrayStack

#print solutionStack

for i in range(0, 9, 1):print solutionStack[len(solutionStack) - 1][i]print ‘total forward:‘,time_tdefcheck_if_need_to_back(self,solutionNow, solutionArray):for i in range(0, 9, 1):for j in range(0, 9, 1):if len(solutionArray[i][j]) == 0 and solutionNow[i][j] ==0:returnTruereturnFalsedefget_resolution_array_new(self,solutionArray, x, y, value):for tmp_j in range(0, 9, 1):if value insolutionArray[x][tmp_j]:

solutionArray[x][tmp_j].remove(value)for tmp_i in range(0, 9, 1):if value insolutionArray[tmp_i][y]:

solutionArray[tmp_i][y].remove(value)for tmp_i in range(x / 3 * 3, x / 3 * 3 + 3):for tmp_j in range(y / 3 * 3, y / 3 * 3 + 3):if value insolutionArray[tmp_i][tmp_j]:

solutionArray[tmp_i][tmp_j].remove(value)returnsolutionArraydefget_solution_array(self,problem):

tmp=[]for i in range(0, 9, 1):

tmp_line_array=[]for j in range(0, 9, 1):#print ‘[‘+bytes(i)+‘,‘+bytes(j)+‘]: ‘+ bytes(problem[i][j])

if problem[i][j] ==0:#no value, get possible value array

tmp_value = [1, 2, 3, 4, 5, 6, 7, 8, 9]#remove the existed value in line

for tmp_j in range(0, 9, 1):if problem[i][tmp_j] !=0:if problem[i][tmp_j] intmp_value:

tmp_value.remove(problem[i][tmp_j])#remove the existed value in column

for tmp_i in range(0, 9, 1):if problem[tmp_i][j] !=0:if problem[tmp_i][j] intmp_value:

tmp_value.remove(problem[tmp_i][j])#remove the existed value in the rectangle

for x in range(i / 3 * 3, i / 3 * 3 + 3):for y in range(j / 3 * 3, j / 3 * 3 + 3):if problem[x][y] !=0:if problem[x][y] intmp_value:

tmp_value.remove(problem[x][y])

tmp_line_array.append(tmp_value)else:

tmp_line_array.append([])

tmp.append(tmp_line_array)#print tmp_line_array

#print tmp

returntmp#get first item to be the point of tree

def get_first_possible_item(self, solution_array, solutionNow =None):

is_finished=True

shortest_item_length= 9shortest_item_x=0

shortest_item_y=0for i in range(0, 9, 1):for j in range(0, 9, 1):

tmp_length=len(solution_array[i][j])if tmp_length !=0:

is_finished=Falseif solutionNow[i][j] !=0:

tmp_length+= 1

if tmp_length

shortest_item_length=tmp_length

shortest_item_x=i

shortest_item_y=j#print ‘shortest item is:‘,shortest_item_length,shortest_item_x,shortest_item_y

ifis_finished:returnFalseelse:return {‘x‘: shortest_item_x, ‘y‘: shortest_item_y}def get_next_possible_item(self, solution_array, prev_x, prev_y, solutionNow =None):if prev_x == -1 and prev_y == -1:returnself.get_first_possible_item(solution_array, solutionNow)else:

is_finished=True

shortest_item_length= 9shortest_item_x=0

shortest_item_y=0for tmp_i in range(0, 9, 1):

tmp_length=len(solution_array[tmp_i][prev_y])if tmp_length !=0:

is_finished=Falseif solutionNow[tmp_i][prev_y] !=0:

tmp_length+= 1

if tmp_length

shortest_item_length=tmp_length

shortest_item_x=tmp_i

shortest_item_y=prev_yif tmp_length == 1:return {‘x‘: shortest_item_x, ‘y‘: shortest_item_y}for tmp_j in range(0, 9, 1):

tmp_length=len(solution_array[prev_x][tmp_j])if tmp_length !=0:

is_finished=Falseif solutionNow[prev_x][tmp_j] !=0:

tmp_length+= 1

if tmp_length

shortest_item_length=tmp_length

shortest_item_x=prev_x

shortest_item_y=tmp_jif tmp_length == 1:return {‘x‘: shortest_item_x, ‘y‘: shortest_item_y}for x in range(prev_x / 3 * 3, prev_x / 3 * 3 + 3):for y in range(prev_y / 3 * 3, prev_y / 3 * 3 + 3):

tmp_length=len(solution_array[x][y])if tmp_length !=0:

is_finished=Falseif solutionNow[x][y] !=0:

tmp_length+= 1

if tmp_length

shortest_item_length=tmp_length

shortest_item_x=x

shortest_item_y=yif tmp_length == 1:return {‘x‘: shortest_item_x, ‘y‘: shortest_item_y}#print ‘shortest item is:‘,shortest_item_length,shortest_item_x,shortest_item_y

ifis_finished:returnself.get_first_possible_item(solution_array,solutionNow)else:return {‘x‘: shortest_item_x, ‘y‘: shortest_item_y}

problem=[

[3,0,8,0,0,0,6,0,0],

[0,4,0,0,6,5,0,0,7],

[7,0,0,4,3,0,0,9,0],

[0,0,7,0,0,1,5,8,0],

[1,0,0,0,2,0,0,0,9],

[0,9,4,7,0,0,2,0,0],

[8,0,0,0,7,4,0,0,0],

[4,0,0,6,5,0,8,1,0],

[0,0,9,0,0,0,7,0,2]

]

f=Soduku(problem)

startTime=time.time()

f.resolve()

endTime=time.time()print "Finished! Time consuming:" + "%.4f" % (endTime-startTime) + "Seconds"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值