数独生成算法

来源:互联网 发布:淘宝卖家刷一单10元 编辑:程序博客网 时间:2024/05/21 10:40
无关的话就不多说了,这是一个生成随机数独的算法,用Python写成的。当然,你也可以把它翻译成你喜欢用的语言,如果你有兴趣的话。如果只想要数独,不想管这程序的内容,你也可以跟我说一下,私信一下或怎样,我帮你生成一下也可以,数量是多少都可以的。这个算法,生成数独是需要概率的,但是不要担心概率的问题,像这种需要概率的问题,也就是需要时间,而,这程序运行的是特别快的,95秒运行10000次,生成了6001个数独,自己看看到底有多快吧。当然,俺的电脑也不差的嘞,Macbook Air。话休絮烦,直接来代码吧。

import randomimport timeclass Sudoku(object):def __init__(self):self.digits = [[] for i in range(9)]def make_digits(self):col_lists = [[] for i in range(9)]area_lists = [[] for i in range(3)]nine = self.random_nine()for i in range(9):col_lists[i].append(nine[i])area_lists[0] = nine[0:3]area_lists[1] = nine[3:6]area_lists[2] = nine[6:]for i in range(8):nine = self.random_nine()if i % 3 == 2:area_lists[0] = []area_lists[1] = []area_lists[2] = []for j in range(9):area_index = j // 3count = 0error = Falsewhile nine[0] in col_lists[j] or nine[0] in area_lists[area_index]:count += 1if count >= len(nine):error = Truebreaknine.append(nine.pop(0))if error:return Falsefirst = nine.pop(0)col_lists[j].append(first)area_lists[area_index].append(first)self.digits = col_listsreturn Truedef random_nine(self):nine = [i + 1 for i in range(9)]for i in range(5):nine.append(nine.pop(random.randint(0, 8)))return nineif __name__ == '__main__':sudoku = Sudoku()f = open('Digits.txt', 'a+')start = time.time()for i in range(500):loop = 0while not sudoku.make_digits():loop += 1if loop > 100:breakif loop < 100:print('No.{0} Sudoku Digits...'.format(i + 1))for col in sudoku.digits:for digit in col:f.write('{0}  '.format(digit))f.write('\n')f.write('\n\n\n')f.close()print('{0} seconds used...'.format(int(time.time() - start)))