朋友家的小侄子上中班,学校竟然就布置数独题目,真狠!!!
虽然是6*6,快乐暑假不快乐了!!!!
在9*9的数独程序中略作修改,
话不多说,直接上代码!
import numpy as np
import time
time1 = time.time()
def six(data):
six_block = np.zeros([2,3,3,2], dtype = int)
for i in range(2):
for j in range(3):
six_block[i,j] = data[3*i:3*(i+1),2*j:2*(j+1)]
return six_block
def num_set(data, six_block):
pick_set = {}
for i in range(6):
for j in range(6):
if data[i,j] == 0:
pick_set[str(i)+str(j)] = set(np.array(range(7))) - \
(set(data[i,:]) | set(data[:,j]) | \
set( six_block [i//3,j//2].ravel()))
return pick_set
def try_insert(data):
insert_step = []
while True:
pick_set = num_set(data, six(data))
if len(pick_set) == 0: break
pick_sort = sorted(pick_set.items(), key = lambda x:len(x[1]))
item_min = pick_sort[0]
key = item_min[0]
value = list(item_min[1])
insert_step.append((key, value))
if len(value) != 0:
data[int(key[0]), int(key[1])] = value[0]
else:
insert_step.pop()
for i in range(len(insert_step)):
huishuo = insert_step.pop()
key = huishuo[0]
insert_num = huishuo[1]
if len(insert_num) == 1:
data[int(key[0]), int(key[1])] = 0
else:
data[int(key[0]), int(key[1])] = insert_num[1]
insert_step.append((key, insert_num[1:]))
break
tiem2 = time.time()
print('\nFinished! using time:', tiem2-time1, 's')
print(data)
if __name__ == '__main__':
data = "0 0 0 0 6 0 \
1 0 0 0 0 0 \
0 2 0 6 0 4 \
3 0 1 0 4 0 \
0 0 0 0 0 5 \
0 4 0 0 0 0 "
data = np.array(data.split(), dtype = int).reshape((6, 6))
print(data)
try_insert(data)